【问题标题】:How to return null for a property and its children keys that are not set in a class?如何为未在类中设置的属性及其子键返回 null?
【发布时间】:2014-07-28 12:41:48
【问题描述】:

如何为未在类中设置的属性及其子键返回 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...

$class1->bar->mars 可以得到null 吗?

【问题讨论】:

标签: php class php-5.5


【解决方案1】:

不要将$this->bar 转换为(object)(这将是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

【讨论】:

    【解决方案2】:

    你不能神奇地做到这一点,我建议编写这样的代码是不好的做法。您正在使用已定义的数据结构,或者您不是。如果你不确定你的数据结构是什么样的,你不应该像->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 会抛出一个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多