这是一个PHP OO错误吗?

时间:2013-08-27 18:22:16

标签: php oop

给出以下示例:

<?php

class Model
{

    private $data = [];

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

    public function __get($property)
    {
        if(isset($this->data[$property]))
        {
            return $this->data[$property];
        }
        throw new Exception("Error trying to access undefined data");
    }

    public static function all()
    {
        // returns all models
    }

    public function save()
    {
        // save something to database 
    }
}

这节课:

class Person extends Model 
{
    protected $name;

    public static function migrateNamesToUppercase()
    {   
        foreach(self::all() as $person)
        {
            $person->name = strtoupper($person->name);
            $person->save();
        }
    }

}
  • 内部静态方法“Person :: migrateNamesToUppercase”$person->name为空。

  • 外部静态方法“Person :: migrateNamesToUppercase”(new Person())->name会抛出预期的异常。

当类实例存在于同一个类的静态方法中时,PHP只假设它可以访问受保护的属性,并且__get__set都不会被执行!可悲的是,私人财产也是如此。

我的问题是:在两种情况下,实例的行为是否应该相同?这是一个已知的错误还是只是一个失败的PHP OO实现?

  • 我用Google搜索并发现没有任何内容

1 个答案:

答案 0 :(得分:4)

  

__get()用于从不可访问的属性中读取数据。

See the PHP manual for details

它按照定义工作。可以从对象访问$name,因此它不使用该方法。如果$name是私有的并且在父类中定义,则它将是不可访问的,因此将使用该方法。