0

如何为未在类中设置的属性及其子键返回 null?

我可以__get用来使该属性返回null,但我不知道如何为其子键执行此操作。有任何想法吗?

class MyClass
{
    public $foo;
    public $bar;

    public function __construct()
    {
        $this->bar = (object) ['tool' => 'Here we go'];   
    }

    public function __get($name)
    {
        return (isset($this->$name)) ? $this->$name : null;
    }
}

$class1 = new MyClass;
var_dump($class1->foo); // null
var_dump($class1->boo); // null
var_dump($class1->bar->tool);  // 'Here we go'
var_dump($class1->bar->mars); // Notice: Undefined property: stdClass::$mars in...

有可能得到null$class1->bar->mars

4

2 回答 2

1

与其强制转换$this->bar(object)which 的实例stdClass(您无法控制),不如创建另一个类来表示您存储的数据$this->bar,并定义类似的__set()__get()方法。

例子:

class KeyValuePairs {
    private $pairs;

    public function __construct( $arr = [])
    {
        $this->pairs = [];
        foreach( $arr as $k => $v) {
            $this->pairs[$k] = $v;
        }
    }

    public function __get($name)
    {
        return (isset($this->pairs[$name])) ? $this->pairs[$name] : null;
    }

    public function __set($name, $value)
    {
        $this->pairs[$name] = $value;
    }
}

然后你可以改变你__construct()的:

public function __construct()
{
    $this->bar = new KeyValuePairs( ['tool' => 'Here we go']);   
}

你得到:

$class1 = new MyClass;
var_dump($class1->foo); // null
var_dump($class1->boo); // null
var_dump($class1->bar->tool);  // 'Here we go'
var_dump($class1->bar->mars); // null
于 2014-07-28T12:49:23.883 回答
1

你不能神奇地做到这一点,我建议编写这样的代码是不好的做法。您正在使用已定义的数据结构,或者您不是。如果你不确定你的数据结构是什么样的,你不应该直接访问它->foo->bar->baz。使用一些代码来代替显式错误处理。我建议:

class MyClass {

    public $values;

    public function __construct() {
        $this->values = ['tool' => 'Here we go'];   
    }

    public function get($name) {
        return array_reduce(explode('.', $name), function ($value, $key) {
            if (is_array($value) && array_key_exists($key, $value)) {
                return $value[$key];
            }
            return null;
        }, $this->values);
    }

}

$foo = new MyClass;
echo $foo->get('tool');
echo $foo->get('non.existent.key');

显然,无论如何,使用明确定义的数据结构是最好的选择,那么您可以确定这些键存在。如果你曾经访问过一个不存在的键,PHP 会抛出一个错误,因为它应该。

于 2014-07-28T12:52:43.130 回答