我会认为下面这段代码应该可以工作,但实际上并没有(已编辑:现在在 PHP 5.5+ 中可以工作):
if (!empty($r->getError()))
其中getError()
仅仅是:
public function getError()
{
return $this->error;
}
然而我最终遇到了这个错误:
无法在写入上下文中使用方法返回值
这是什么意思?这不只是一个读取吗?
我会认为下面这段代码应该可以工作,但实际上并没有(已编辑:现在在 PHP 5.5+ 中可以工作):
if (!empty($r->getError()))
其中getError()
仅仅是:
public function getError()
{
return $this->error;
}
然而我最终遇到了这个错误:
无法在写入上下文中使用方法返回值
这是什么意思?这不只是一个读取吗?
empty()
需要通过引用来访问值(以检查该引用是否指向某个存在的东西),而PHP 5.5之前不支持对从函数返回的临时值的引用。
然而,你真正面临的问题是你在使用empty()
,错误地认为"空"值与"false"有所不同。
空只是!isset($thing) || !$thing
的别名。当你要检查的东西始终存在时(在PHP中,函数调用的结果始终存在),empty()
函数就是一个否定运算符。
PHP没有空的概念。评估为false的值是空的,评估为true的值是非空的。这段代码:
$x = something();
if (empty($x)) …
以及这个:
$x = something();
if (!$x) …
无论数据类型如何,对于所有情况,empty()
函数始终具有相同的结果(因为变量$x
已经被定义为空)。
该方法始终返回一个值(即使没有return
语句,返回值仍然存在且包含null
)。因此:
if (!empty($r->getError()))
逻辑上等同于:
if ($r->getError())
empty()
是 (boolean) var
的反义词,唯一的区别是当变量未设置时不会生成警告。” - Kornel// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))
isset()
也是同样的情况。例如:isset($this->foo->getBar())
将会导致同样的问题。 - catchdaveempty() 只能检查变量,否则会导致语法解析错误。
在 PHP < 5.5 上,你不能直接在函数的返回值上使用 empty()
。相反,你需要将 getError()
的返回值赋给一个变量,并在变量上运行 empty()
。
在 PHP >= 5.5 中,这已经不再需要了。
我通常会创建一个名为is_empty()的全局函数来解决这个问题。
function is_empty($var)
{
return empty($var);
}
那么在我通常使用 empty() 的任何地方,我只需使用 is_empty()。
!
运算符可以实现这个功能吗? :) - Kornel正如其他人指出的那样,这是empty()函数的一个(奇怪的)限制。
对于大多数情况而言,这么做等同于调用empty()函数,但是以下方法也可以达到同样的效果:
if ($r->getError() != '')
public function getError() {
return $this->error;
}
public function isErrorSet() {
if (isset($this->error) && !empty($this->error)) {
return true;
} else {
return false;
}
}
现在,这段代码可以正常运行,没有任何提示。
if (!($x->isErrorSet())) {
echo $x->getError();
}
我不确定这是否是一个常见的错误,但如果您做了类似以下的事情:
$var = 'value' .= 'value2';
这也会产生相同的错误。
无法在写入上下文中使用方法返回值
你不能在同一语句中同时使用=
和.=
。你可以使用一个或另一个,但不能同时使用。
请注意,我明白这与问题中实际的代码无关,但当搜索错误消息时,此问题是顶部结果,因此我想在这里发布以保持完整性。
检查数组是否为空的另一种方法可能是:
count($array)>0
对我来说,它可以正常工作,没有出现错误。
empty
:https://wiki.php.net/rfc/empty_isset_exprs - Carlos Campderrósif ( !$e->find('div') )
,它检查当前的 HTML DOM 元素是否为空。我在循环内使用它来仅打印出不包含内部 Div 的单个 Div。 - Salem