在写入上下文中不能使用方法返回值
我会认为下面的一段代码应该可以工作,但不会(编辑:现在在PHP 5.5+中工作) :
if (!empty($r->getError()))
getError()
简单来说就是:
public function getError() { return $this->error; }
但是,我最终得到这个错误:
在写入上下文中不能使用方法返回值
这是什么意思? 这不只是一个读取?
empty()
需要通过引用来访问这个值(为了检查这个引用是否指向了某个存在的东西),而5.5之前的PHP不支持对从函数返回的临时值的引用。
然而,你真正的问题是你使用empty()
,错误地认为“空”的价值是任何不同于“假”。
空只是!isset($thing) || !$thing
的别名 !isset($thing) || !$thing
。 当你检查的东西总是存在的时候(在PHP中,函数调用的结果总是存在的), empty()
函数不过是一个否定运算符 。
PHP 没有空白的概念 。 评估为false的值为空,评估为true的值非空。 这是同一件事。 此代码:
$x = something(); if (empty($x)) …
和这个:
$x = something(); if (!$x) …
在所有情况下,对于所有的数据types,总是有相同的结果 (因为$x
被定义为empty()
是多余的)。
方法的返回值总是存在的(即使你没有return
语句,返回值也是存在的,并且包含null
)。 因此:
if (!empty($r->getError()))
在逻辑上相当于:
if ($r->getError())
注意:这是一个非常高的投票答案,具有很高的知名度,但请注意,它会促进糟糕的,不必要的编码实践! 请参阅@ Kornel的正确答案 。
注#2:我赞同使用@Kornel答案的build议。 当我三年前写这个答案的时候,我只是想解释错误的本质,不一定是赞同的。 下面的代码片段是不推荐的。
这是PHP版本低于5.5的空()的限制。
注意:empty()只检查variables,否则会导致分析错误。 换句话说,以下内容将不起作用:empty(trim($ name))。
你必须改变这一点
// Not recommended, just illustrates the issue $err = $r->getError(); if (!empty($err))
根据PHP文档 :
empty()只检查variables,否则会导致parsing错误
你不能直接在函数的返回值上使用empty()
。 相反,将getError()
的返回值设置为一个variables,并在variables上运行empty()
。
我通常创build一个叫做is_empty()的全局函数来解决这个问题
function is_empty($var) { return empty($var); }
然后,我通常会使用空()我只是使用is_empty()
正如其他人指出的那样,这是一个(怪异的)空()的限制。
对于大多数的紫癜,这样做是相等的空调,但这是有效的:
if ($r->getError() != '')
问题是这个,你想知道错误是不是空的。
public function getError() { return $this->error; }
添加一个方法isErrorSet()将解决问题。
public function isErrorSet() { if (isset($this->error) && !empty($this->error)) { return true; } else { return false; } }
现在这个可以正常工作,没有任何通知。
if (!($x->isErrorSet())) { echo $x->getError(); }
检查一个数组是否为空的替代方法可能是:
count($array)>0
它适用于我没有这个错误