是否有开关禁用"无法在写入上下文中使用临时表达式"错误?

gre*_*man 7 php

在PHP7中添加了错误,我遇到以下代码的问题:

(some complex expression)->my_property = 1
Run Code Online (Sandbox Code Playgroud)

请注意我分配给对象的字段,而不是对象本身(分配给临时对象没有意义,我同意,但在这里并非如此).

这给了我一个错误"不能在写上下文中使用临时表达式".当我重写为:

$tmp = (some complex expression);
$tmp->my_property = 1;
Run Code Online (Sandbox Code Playgroud)

一切都好.问题是我必须有单个表达式(赋值是一个表达式),并且因为PHP现在不支持逗号运算符,所以我要用两个语句来讨论.

对我来说这是巨大的差异,因为我无法将整个代码作为表达式进一步传递.在"复杂表达"中,一切都是有效的,所以我很乐意在PHP中禁用该检查.

可能吗?怎么样?

我的代码是自动编写的(它是生成的),表达式的结果是一个有效的PHP对象,问题是PHP以某种方式没有注意到它.此外,第二种形式有效.

更新:这是我上面提到的复杂表达式的一个例子:

(($a = foo()) === 0 ? $a : bar())
Run Code Online (Sandbox Code Playgroud)

Hen*_*nry 6

我在重构一些编写错误的代码时出现了这个错误:

class MyClass {

    static $cache = [];

    public function myFunction() {
            $this->cache['foo'] = 'bar';
    }
Run Code Online (Sandbox Code Playgroud)

我改写了这个解决非静态参考$cache里面myFunction:

class MyClass {

    static $cache = [];

    public function myFunction() {
            self::cache['foo'] = 'bar';
    }
Run Code Online (Sandbox Code Playgroud)

注意我错过了$,应该写的self::$cache['foo'].

这产生了错误cannot use temporary expression in write context,这不是特别有用.在我的情况下,我试图做的事情没有错,只是简单的错字.


Why*_*rrh 5

我要说不。

在“复杂表达式”中,所有内容都是有效的,因此我很想在PHP中禁用该检查。

我认为这里的问题在于,禁止写临时表达式不仅是PHP中的“检查”,而且是7.1(在中引入5c2120b)语言的一部分。

截至5c2120b,语言语法已更新,将重新定义的内容重新定义为:

dereferencable:
        variable                { $$ = $1; }
    |   '(' expr ')'            { $$ = $2; zend_do_begin_variable_parse(TSRMLS_C); $$.EA = 0; }
    |   dereferencable_scalar   { $$ = $1; zend_do_begin_variable_parse(TSRMLS_C); $$.EA = 0; }
;
Run Code Online (Sandbox Code Playgroud)

源于GitHub

另外,您会注意到代码库中这些错误的源在产生错误之前不会进行任何检查,例如12

解决方法是将其降级到允许该功能的PHP版本。