【问题标题】:PHP Array access without quotes不带引号的 PHP 数组访问
【发布时间】:2012-11-29 09:23:34
【问题描述】:

我在现有的 php 源中发现了一个现象, 像这样没有撇号的字段访问:$_GET[test]。

我不确定,也不知道,这是一种可能的方式, 所以我写了一个简短的测试示例:

echo "Array Test, fields without apostrophe, like \$_GET[fieldname]<BR><BR>";
$a = array();
$a['test'] = "ArrayValue";
echo "case 1 -> \$a['test']: " . $a['test'] . "<BR>";
echo "case 2 -> \$a[\"test\"]: " . $a["test"] . "<BR>";
echo "case 3 -> \$a[test]: " . $a[test] . "<BR>";

而且它有效,每个结果都有值(ArrayValue)。

我更喜欢案例2这样的访问方式。

案例 3 是 php 中正常的、允许的编码风格吗?

【问题讨论】:

  • 我记得在使用未定义的常量时收到警告,它被视为字符串。但是不,这不是“允许的编码风格”。
  • 感谢您的回答!我检查了 apache 日志,它没有发出警告(php.ini: error_reporting = E_ALL & ~E_DEPRECATED; phpinfo: 22527)。很高兴听到,这不是一个好风格!
  • EASY,define() 所有的键都说define('test','test')

标签: php arrays apostrophe


【解决方案1】:

这里发生的情况是,PHP 将 a constant 称为 test。如果定义了常量,则返回值,如果没有定义,PHP 会回退到字符串"test"。例如:

$array = array("A" => "Foo", "B" => "Bar", "C" => "Baz")
define("B", "C");

echo $array[A];   // The constant "A" is undefined, 
                  // so PHP falls back to the string "A", 
                  // which has the value "Foo".
echo $array["B"]; // The result is "Bar".
echo $array[B];   // The value of constant "B" is the string "C".
                  // The result is "Baz".

它是为了向后兼容,你永远不应该使用它。如果你turn on notices,你会看到 PHP 抱怨它。

【讨论】:

【解决方案2】:

如果您不将键放在引号中,它将被作为未定义的常量处理(假设它没有在任何地方定义),这可能暂时有效,但在未来的 PHP 版本中可能会失败。因此它是错误的,PHP 文档也指出这个变体是错误的。查看“Arrays do's and don'ts”。

顺便说一句:如果将键放在双引号中,它会将变量呈现在键名中。

【讨论】:

    【解决方案3】:

    使用不带引号的数组键名是 PHP 中的一项遗留功能。它最初是这样做的方式,但不再推荐它,并且仍然支持向后兼容。如果您启用了严格模式,它将引发警告消息。

    它起作用的原因是它将这种形式的键名视为一个常量。当 PHP 看到一个未知常量时,它默认将常量的名称作为值,因此它可以作为字符串替换。

    如果您在程序中的其他地方有define() 来设置该常量的值,它将中断。如果您的键名包含空格、以数字开头或由于任何其他原因是无效的常量名,它也不起作用。

    由于这些原因,不建议使用此方法。

    但最重要的是,PHP 开发人员已公开表示这不是一种好的做法,这很可能意味着未来的 PHP 版本将取消编写这样的代码的能力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      相关资源
      最近更新 更多