给出以下示例:
<?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实现?
答案 0 :(得分:4)
__get()
用于从不可访问的属性中读取数据。
See the PHP manual for details
它按照定义工作。可以从对象访问$name
,因此它不使用该方法。如果$name
是私有的并且在父类中定义,则它将是不可访问的,因此将使用该方法。