我的情况并不复杂,但花了我一段时间才弄清楚。

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出于某种原因检查类结构,而不是在方括号内运行代码。为什么不按预期评估此代码?

这是错误还是为什么不能正常工作?

最佳答案

首先,在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

关于php - empty()和魔术方法__get(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25574791/

10-09 14:27