难道我发现了PHP的BUG?不然无法解释为什么empty会是true!

查看:62
本文介绍了难道我发现了PHP的BUG?不然无法解释为什么empty会是true!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

<?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
?>

解决方案

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

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

  1. class中声明魔术方法__isset()
  2. 赋值为变量

这篇关于难道我发现了PHP的BUG?不然无法解释为什么empty会是true!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆