這個問題在這里已經有了答案: 為什么 PHP 私有變數適用于擴展類? (1 個回答) 36 分鐘前關閉。
私有屬性只能在其類內部訪問,而不能在類外部訪問。因此,如果我將其設為物件,我將無法使用其物件訪問私有屬性,因為它在類之外。但是我正在試驗,當我創建它的派生類的物件時,該物件很容易訪問基類私有屬性。
這到底怎么可能??請幫忙!
class base{
private $name;
}
class derived extends base { }
$test = new derived();
$test->name = "Lady Gaga";
echo $test->name; // outputs : Lady Gaga
這怎么可能從它的派生類物件訪問私有成員?
uj5u.com熱心網友回復:
因為 PHP 有默認的魔法設定器。
您的線路$test->name = "Lady Gaga";在可訪問的物件上設定新的公共屬性。與物件上$test->foo沒有foo屬性時所做的相同。
要查看效果,請擴展您的課程:
class base{
private $name;
public $foo;
public function __set($property, $value) {
var_dump('Magic setter called', $property, property_exists($this, $property));
}
}
class derived extends base { }
$test = new derived();
$test->foo = "Lady Gaga 1";
$test->name = "Lady Gaga 2";
// string(19) "Magic setter called"
// string(4) "name"
// bool(true)
活生生的例子
uj5u.com熱心網友回復:
您可以訪問此屬性,因為您設定的不是私有屬性,而是公共動態屬性。因為您是base在中擴展類derived,所以該類根本無法訪問derived私有屬性(私有屬性只能在宣告它們的同一個類中訪問,而不能在子類中訪問),因此從技術上講,name內部沒有屬性在derived類。如果你用這個base類來嘗試這個例子,你會得到Cannot access private propertyPHP的例外。
uj5u.com熱心網友回復:
您不會在那里訪問父類的“繼承私有財產” base:
- 這些屬性不會被繼承到子類
derived,因此是屬性名稱。 - 您正在物件中創建一個新的公共屬性并為其分配一個值。
$name$test - 最后,您正在呼應物件
$test新創建的非私有屬性$name。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/346714.html
上一篇:帶有指標型別的C 模板繼承
