【问题标题】:Weird behavior with PHP's empty() functionPHP 的 empty() 函数的奇怪行为
【发布时间】:2018-08-09 13:02:43
【问题描述】:

PHP 的 empty() 函数开始出现奇怪的行为。过去一切正常,但现在不行,我不明白为什么。

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

该类有一个 getBootloaderRevision 方法/属性:

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

它以前可以工作,但现在,即使成员有值,empty() 函数也会返回 true。这是一个例子:

$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>";

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

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

01.07
01.07
1
0

我在这里迷路了。我不明白为什么会这样。我知道它曾经有效,我已经一年多没有碰过这个了。我们最近在服务器上进行了更新,它似乎从服务器开始就开始这样做了。我不负责更新,但我认为他们更新了操作系统和 PHP。

你见过这样的吗???

谢谢,

【问题讨论】:

  • 0 不被认为是空的,如果这与 db 相关,也不是 NULL。
  • @Funk empty(0)empty(null) 非常像 true...!
  • __isset() 是否定义在 tbInventory 类中?
  • 还有多少人会在这里联系我? 我明白了。 天哪。放松的人。
  • 如果可能,将tbInventory 减少到显示此行为的最低限度并发布该代码;如图所示,这是不可重现的。

标签: php database


【解决方案1】:

唯一可以解释这种行为的是cBootloaderRevision 不是“物理”属性,而是使用__get 魔术方法检索,并且该类没有实现__isset 方法或该方法返回的结果与__get 不一致。原因是empty会先调用__isset,而$prod-&gt;cBootloaderRevision只会调用__get

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

【讨论】:

  • 我必须分析 DAL,我不是制造它的人......它似乎没有使用神奇的吸气剂,但这些也不是真正的成员。它们是使用 TableObject 类中定义的 add() 函数添加的,所有表都从该类继承。奇怪的是,这段代码至少在一年半到两年内没有改变。它总是过去工作..直到上周。我已经通过使用变量解决了这个问题。无论如何,这些属性的编码都很糟糕......现在属性将“成员”写入变量,然后我使用 return empty($var) : null : $var;
  • 所以问题已解决...但没有解释 XD。碰巧,这是我唯一拥有这样做的属性的类。我有两个,当然,两个都有同样的问题。我想一旦我花一两个小时来分析 DAL,我就会确切地知道发生了什么。从来没有真正有时间去研究它,哈哈。感谢您的帮助伙伴!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 2011-06-14
  • 2020-01-31
  • 2014-05-24
相关资源
最近更新 更多