PHP如何解释这段代码?
我想知道php是如何解释这段代码的。是语法错误还是匹配优先?非常感谢您的帮助。PHP如何解释这段代码?,php,interpreter,Php,Interpreter,我想知道php是如何解释这段代码的。是语法错误还是匹配优先?非常感谢您的帮助。 代码: 那么,你是指$key['name']还是$man->$key和['name']?它的语法不明确,PHP以前一种方式解释它,试图获取字符串'name'的索引'name',导致输出警告,解释为'name'[0],即'n' 消除语法歧义: $man->{$key}['name'] 那么,你是指$key['name']还是$man->$key和['name']?它的语法不明确,PHP以前一种方式解释它,试图获
代码:
那么,你是指
$key['name']
还是$man->$key
和['name']
?它的语法不明确,PHP以前一种方式解释它,试图获取字符串'name'
的索引'name'
,导致输出警告,解释为'name'[0]
,即'n'
消除语法歧义:
$man->{$key}['name']
那么,你是指
$key['name']
还是$man->$key
和['name']
?它的语法不明确,PHP以前一种方式解释它,试图获取字符串'name'
的索引'name'
,导致输出警告,解释为'name'[0]
,即'n'
消除语法歧义:
$man->{$key}['name']
这不会转换为任何内容,因为您试图使用变量标记访问属性。这不是一个变量,它不会起作用:
echo $man->$key['name'];
另一方面,这将起作用:
echo $man->{$key}['name'];
这让php知道您将要使用的$key实际上是一个包装在{}中的属性,这不会转换为任何内容,因为您试图访问带有变量标记的属性。这不是一个变量,它不会起作用:
echo $man->$key['name'];
另一方面,这将起作用:
echo $man->{$key}['name'];
这让php知道您将要使用的$key实际上是一个包装在{}中的属性,您的类中没有定义name属性。因为
echo$man->$key['name'];转换为回显名称['name]代码>类中没有定义名称属性。因为echo$man->$key['name'];转换为回显名称['name]代码>
class Man {
var $arr = array("name"=>"me");
}
$key = 'arr';
$man = new Man();
echo $man->arr['name']; // output me
echo $man->{$key}['name']; // output nothing along with warning and notice
看看我是如何在$key
周围使用方括号的。如果不提供括号,它将解释为$key[0]
:
echo$man->a
但您无法访问数组值
看看我是如何在$key
周围使用方括号的。如果不提供括号,它将解释为$key[0]
:
echo$man->a
但您不能访问数组值。因为$man
是类的对象如果您想打印一些,它应该在类中尝试以下代码:
class Man{
var $arr=array("name"=>"me");
}
$key='name';
$man=new Man;
echo $man->arr[$key]; //output me
因为$man
是类的对象,如果您想打印一些,它应该在类中,请尝试以下代码:
class Man{
var $arr=array("name"=>"me");
}
$key='name';
$man=new Man;
echo $man->arr[$key]; //output me
$key
是名称
。Man
类中没有属性name
。这就是为什么会有一个警告。上面的语法看起来也像PHP4语法。请尽量避免,您的同事会很感激的。PHP 7还有另一个输出(注意:未定义的属性:Man::$name
):$key
是name
。Man
类中没有属性name
。这就是为什么会有一个警告。上面的语法看起来也像PHP4语法。请尽量避免,您的同事会很感激的。PHP 7还有另一个输出(注意:未定义的属性:Man::$name
):非常感谢,塞萨尔·费雷拉。很高兴我能帮上忙;)非常感谢,塞萨尔·费雷拉。很高兴我能帮忙;)@如果您认为这个答案解决了您的问题,请单击灰色复选图标将其标记为已接受。这是一种复杂(卷曲)语法。这里是链接:我认为它试图获取字符串“n”而不是字符串“name”的索引'name'
。如果不提供括号,则只考虑字符串的第一个字符。@Pooya“非法字符串偏移量'name'”→ 它试图获取字符串的偏移量['name']
,这显然意味着它正在尝试$key['name']
,其中$key
是字符串。由于'name'
是字符串的无效/非法偏移量,因此会产生此警告。然后返回到将偏移量'name'
解释为下一个最佳数值偏移量,它最终是0
((int)'name'
→ <代码>0
)。因此它会产生$key[0]
。然后将其转换为$man->n
和“未定义的属性:man:$n
”。请参阅。@如果您认为此答案解决了您的问题,请单击灰色复选图标将其标记为已接受。这是一种复杂(卷曲)语法。这里是链接:我认为它试图获取字符串“n”而不是字符串“name”的索引'name'
。如果不提供括号,则只考虑字符串的第一个字符。@Pooya“非法字符串偏移量'name'”→ 它试图获取字符串的偏移量['name']
,这显然意味着它正在尝试$key['name']
,其中$key
是字符串。由于'name'
是字符串的无效/非法偏移量,因此会产生此警告。然后返回到将偏移量'name'
解释为下一个最佳数值偏移量,它最终是0
((int)'name'
→ <代码>0
)。因此它会产生$key[0]
。然后将其转换为$man->n
和“未定义的属性:man:$n
”。看,我觉得你的解释不对$此->$key['name']将解释为“name['name']”,但name没有索引“name”,因此它将返回“name[0]”,即“n”。请参考deceze的答案。@Max看我自己的例子$key='arr'
和$arr已经有了索引name
,但php仍然将$key
解释为$a
。只需运行没有括号的示例,然后查看结果。我希望你这次能得到。如果有什么不清楚的就告诉我。很抱歉。忽略我的评论。我认为你的解释不正确$此->$key['name']将解释为“name['name']”,但name没有索引“name”,因此它将返回“name[0]”,即“n”。请参考deceze的答案。@Max看我自己的例子$key='arr'
和$arr已经有了索引name
,但php仍然将$key
解释为$a
。只需运行我的示例