难道我发现了PHP的BUG?不然无法解释为什么empty会是true!
本文介绍了难道我发现了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种方式
- 在
class
中声明魔术方法__isset()
- 赋值为变量
这篇关于难道我发现了PHP的BUG?不然无法解释为什么empty会是true!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文