0

给定以下示例:

<?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 实现?

  • 我用谷歌搜索了一下,一无所获
4

1 回答 1

4

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

有关详细信息,请参阅 PHP 手册

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

于 2013-08-27T18:31:10.807 回答