考慮下面的例子:這是一個PHP的OO錯誤?
<?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();
}
}
}
內部靜態方法 「人:: migrateNamesToUppercase」
$person->name
爲空。外部靜態方法「Person :: migrateNamesToUppercase」
(new Person())->name
將引發預期的異常。
當類實例住同一類PHP的靜態方法裏面就假定它能夠訪問受保護的財產,既不__get
或__set
執行!可悲的是,私人財產也會發生同樣的情況。
我的問題是:在兩種情況下,實例的行爲不應該是相同的嗎?這是一個已知的bug還是僅僅是一個失敗的PHP OO實現?
- 我GOOGLE了一下,沒有發現任何
您正在運行PHP 5.4或5.5,它們是不同的版本 –
它發生在兩個版本中。我不確定5.3 – marcio
沒有任何面向所有靜態方法的對象... – rdlowrey