empty()和magic方法__get()

时间:2014-08-29 19:12:26

标签: php

我所处的情况并不复杂,但我花了一段时间来计算它。

class A {

    private $data = array('key' => 'value');

    public function __get($name){
        return $this->data[$name];
    }

}

$a = new A();
var_dump(empty($a->key)); // TRUE

我想这是因为empty由于某种原因检查类结构而不是在括号内运行代码。为什么不按预期评估此代码?

这是一个错误还是为什么它无法正常工作?

1 个答案:

答案 0 :(得分:6)

首先,在PHP中,您需要使用$this->来访问类$data之类的变量(所以$this->data代替$data)。在使用其他语言一段时间后很容易忘记,但如果您未将错误报告设置为E_ALL而开发代码,则应将其设置为该值。在开发期间将其设置为E_ALL可让您更轻松地找到(潜在)错误,例如此错误,并将提高您的代码质量。

要解决您的实际问题,为了确定是否为魔术变量设置变量,您需要添加__isset魔术方法(manual):

<?php

class A {

    private $data = array('key' => 'value');

    public function __get($name){
        return $this->data[$name];
    }
    public function __isset($name){
        return array_key_exists($name, $this->data);
    }

}

$a = new A();
var_dump(empty($a->key)); // it's FALSE now