素材牛VIP会员
难道我发现了PHP的BUG?不然无法解释为什么empty会是true!
 非***扰  分类:PHP代码  人气:1482  回帖:2  发布于6年前 收藏
<?php
class A{
    public $data;
    public $obj;
    function __construct()
    {
        $this->data  = array();
        $this->obj   = new stdClass();
    }
    function __set($name, $value)
    {
        $this->data[$name] = $value;
        if (is_object($this->obj)) {
            $this->obj->$name = $value;
        }
    }
    function __get($name)
    {
        if (is_object($this->obj)) {
            return $this->obj->$name;
        }
    }
}
$a = new A();
$a->a = '123';
var_dump($a->a);   //123
echo "<br>";
var_dump(empty($a->a));  //true,为什么这里会是true?百思不得其解,bug?
echo "<br>";
$b = $a->a;
var_dump(empty($b));   //false
?>
 标签:php

讨论这个帖子(2)垃圾回帖将一律封号处理……

Lv1 新人
kg***25 页面重构设计 6年前#1

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

Note:
在除 isset() 外的其它语言结构中无法使用重载的属性,这意味着当对一个重载的属性使用 empty() 时,重载魔术方法将不会被调用。

为避开此限制,必须将重载属性赋值到本地变量再使用 empty()。

搬运工。。。

Lv6 码匠
追***忆 UI设计师 6年前#2

这是因为empty()方法的参数为一个class的属性时,它需要基于这个类中的魔术方法__isset(),由于你这个class中没有声明这个魔术方法,所以判断类属性时是true,至于第二个你已经赋值为变量,这时候empty判断的就是变量而不是类的属性,具体请参考官方文档第一个例子的解释:http://cn2.php.net/manual/zh/...

针对你这种问题,你有2种方式

  1. class中声明魔术方法__isset()
  2. 赋值为变量
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取