method() 在 PHP 中会出现语法错误?-6ren"> method() 在 PHP 中会出现语法错误?-让我们考虑以下代码: test(); //This does not, syntax error $x = new X()->test(); echo $x; 为什么? 顺便说一句:我知道它是在 ph-6ren">
gpt4 book ai didi

php - "Operator"优先级?为什么 new Object()->method() 在 PHP 中会出现语法错误?

转载 作者:行者123 更新时间:2023-12-04 17:55:46 28 4
gpt4 key购买 nike

让我们考虑以下代码:

<?php

class X{
public function test(){
return 'test';
}
}

//This obviously works:
$x = (new X())->test();
//This does not, syntax error
$x = new X()->test();
echo $x;

为什么?

顺便说一句:我知道它是在 php 5.4 中引入的

这不是关于“如何”,而是关于“为什么”——我知道第一种语法是手册中记录的语法。实际上,更多的是关于在哪里以及如何找到答案。

根据我目前所学,同时在别处提问:

-> 实际上不是“运算符”,它是一个“标记”或“词法标记”——这对我帮助不大。

第一个版本等于说:“new (DateTime()->format())”,这显然是错误的。这表明它是关于“运算符优先级”的,但是 #1 - -> 不是运算符(对吗?),以及 #2 - 为什么没有任何地方对此进行记录?

顺便说一句,关于 http://php.net/manual/en/language.operators.precedence.php我们可以读到"new"运算符结合性既不是左也不是右,它是无,我们还可以读到“非结合的同等优先级运算符不能彼此相邻使用,例如 1 < 2 > 1 是在 PHP 中是非法的”所以...如果 -> 是一个运算符(并且它是非关联的)那么一切都会很清楚,但它是一个运算符吗?如果是,那么为什么它没有列在上面的列表中(http://php.net/manual/en/language.operators.precedence.php)?

最佳答案

因为它是模棱两可的,即它可以用两种不同的方式解释:

  • 在新的 X 实例(您想要的实例)上调用 test():

    $object = new X();$x      = $object->test();
  • Create a new instance of a class name returned by method test() on the object returned by function X():

    $object = X();$class  = $object->test();$x      = new $class();

Strangely enough, there's actually no way to write a one-liner for the second case ... the following won't work:

new (X()->test());   // syntax error
new (X()->test())(); // syntax error

但是,您还是明白了。

关于php - "Operator"优先级?为什么 new Object()->method() 在 PHP 中会出现语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40621958/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com