PHP的empty()函数的怪异行为

时间:2018-08-09 13:02:44

标签: php database

我开始对PHP的empty()函数产生奇怪的行为。一切都可以正常工作,但是现在不行了,我不明白为什么。

我有一个tbInventory类来表示产品。每单位一条记录。

该类具有getBootloaderRevision方法/属性:

T2[2]

它曾经可以工作,但是现在,即使成员具有值,empty()函数也将返回true。这是一个示例:

public function getBootloaderRevision() {
    if (empty($this->cBootloaderRevision)) {
        return null;
    } else {
        return $this->cBootloaderRevision;          
    }
}

我正在从数据库中加载一个项目,该项目我知道具有BootLoader修订版。我声明并在第一行加载它,然后将MEMBER本身的值直接放入变量中。然后,我同时回显成员和变量,以证明它们都具有值。

然后,根据成员和变量的empty()函数的结果,回显1或0。结果如下:

$prod = new tbInventory($db, 1009);
$test = $prod->cBootloaderRevision;
echo $prod->cBootloaderRevision . "<br>";
echo $test . "<br>";
echo (empty($prod->cBootloaderRevision) ? "1" : "02") . "<br>";
echo (empty($test) ? "1" : "0") . "<br>";

我在这里迷路了。我不明白为什么会这样。我知道它曾经有用,但是我一年多没有碰到它了。我们最近在服务器上进行了更新,自服务器以来似乎已经开始以这种方式进行操作。我不负责更新,但是我认为他们同时更新了OS和PHP。

您见过类似的东西吗?

谢谢

1 个答案:

答案 0 :(得分:2)

唯一可以解释此行为的是cBootloaderRevision不是“物理”属性,而是通过__get魔术方法检索的,并且该类中没有{{1} }方法已实现,或者该方法返回的结果与__isset不一致。原因是__get首先会调用empty,而__isset只会调用$prod->cBootloaderRevision

请参见http://php.net/manual/en/language.oop5.overloading.php#object.get