当前位置: 首页 > 知识库问答 >
问题:

PHP对象运算符优先级(->)

宇文勇
2023-03-14

我编写了一些代码:

class a{
    public $b=['f'=>'c'];
}
$a=new a;
$b='b';
echo $a->$b['f'];

当我使用cli时,它输出'c',但是当我使用apache http服务器时,抛出一个错误非法字符串偏移量'f',所以我不知道->[之间哪个优先级更高。http://PHP.net上没有关于->的介绍。我的PHP版本是5.6,使用的是windows 10.在Linux下,cli和httpd将输出'c'。

共有3个答案

皮安顺
2023-03-14

那么echo($a->$b)['f'];呢?

沈思博
2023-03-14

您的代码几乎是正确的--只要去掉第二个$!

class a{
    public $b=['f'=>'c'];
}
$a=new a;
$b='b';
echo $a->b['f']; // without the $ it works
$x = $a->$b;  // otherwise you need to assign first
echo $x['f']; // now it works
echo $a->{$b}['f']; // or wrapped in curlies

参见https://3v4L.org/gzjwt

优先级为$。换句话说,$x->$b['f']首先认为$b是一个数组,因此它查找不存在的$b['f'],因此出现了错误。将花括号放在$b周围会迫使PHP首先计算它,给出值'b',然后它就变成$x->b['f'],它存在并因此工作。

华项明
2023-03-14

要了解->[之间的优先顺序,您可能需要查看这里的PHP7迁移文档。我知道您在谈论PHP5,但是迁移文档注意到了这一点,因为PHP5和PHP7之间的行为发生了变化。

为了回答您的问题,$foo->$bar['baz']在PHP5中解释为$foo->{$bar['baz']}。这意味着您的代码应该会引发错误,因为它正在使用$B='b';作为$B的定义时,正在尝试访问$B['f']

然而,在PHP7中,它被解释为($foo->$bar)['baz'],因此在这里它应该按照您的预期工作。

你确定你的CLI没有使用PHP7吗?

 类似资料:
  • 从高到低顺序如下: ^ not - (一元运算) * / + - ..(字符串连接) < > <= >= ~= == and or

  • 通过前面的学习我们知道运算符有不同的类型,当这些不同类型的运算符出现在同一个表达式中时,就必须遵循运算符的优先级来进行运算,才能保证运算的合理性和结果的正确性、唯一性。运算符的优先级决定了表达式中各个部分执行运算的先后顺序。 下表中详细介绍了 C# 中运算符的优先级顺序: 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[整型表达式] 左到右   () 圆括号 (表

  • 运算符的优先级决定了不同的运算符在表达式中计算的先后顺序,下表列出了 MySQL 中的各类运算符及其优先级。 优先级由低到高排列 运算符 1 =(赋值运算)、:= 2 II、OR 3 XOR 4 &&、AND 5 NOT 6 BETWEEN、CASE、WHEN、THEN、ELSE 7 =(比较运算)、<=>、>=、>、<=、<、<>、!=、 IS、LIKE、REGEXP、IN 8 | 9 & 10

  • 所有的数学运算都认为是从左向右运算的, Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。 乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。 一般而言,单目运算符优先级较

  • 问题内容: 由于Java中运算符优先级的正确性,我感到困惑。我在教程很久以前读到并具有更高的优先级高于OR,这是在提供的答案确认问题。但是,我目前正在使用《 Sun Java 6认证程序员学习指南》学习Java。本书包含以下示例: 我复制并引用了有关编译器如何处理上述代码的解释: 是,然后是或结果 为,然后打印。由于存在短路,因此对表达式进行评估,好像周围有括号。换句话说,它被评估为之前的单个表达

  • 正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。 相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序: 运算符 描述 \ 转义符 (), (?:), (?=), [] 圆括号和方括号 *, +, ?, {n}, {n,}, {n,m} 限定符 ^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序) | 替

  • EL中的运算符都有不同的运算优先级,表7.5列出了EL中的运算符的优先级,上一行运算符的优先级要高于后一行的优先级。对于同一行的运算符,按着运算符在表达式中出现的顺序从左到右依次计算。 表7.5 运算符的优先级 [] . () - (一元)  not  !  empty *  /  div  %  mod +  - (二元) <  >  <=  >=  lt  gt  le  ge ==  !=

  • 问题内容: 我似乎无法与三元运算符结合使用此代码的第一部分(+ =)。 我认为这段代码的工作方式如下: 但这是不正确的,因为这会导致控制台出现错误。 所以我的问题是我应该如何正确插入此代码? 问题答案: h.className = h.className + (h.className ? ‘ error’ : ‘error’) 您希望操作员为之工作,最好对此有所具体。 当然,不应有任何伤害 ,但这