给定以下示例:
<?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 实现?
- 我用谷歌搜索了一下,一无所获