[英]How do I refer to a child class variable from an inherited parent class method in PHP?
說我有兩個班:
class ParentClass
{
public function getSomething()
{
return $this->variable_name;
}
}
class ChildClass extends ParentClass
{
private $variable_name = 'something specific to child class';
...
}
然后我調用代碼來實例化ChildClass
並調用繼承的getSomething()
方法:
$object = new ChildClass();
$value = $object->getSomething();
當我調用最后一行時,它會給我一個錯誤,因為在ParentClass
中不存在$variable_name
。 我希望ChildClass
繼承getSomething()
方法,但我明白,因為它沒有在ChildClass
顯式覆蓋,所以它在運行方法的父版本時使用父范圍。
我怎樣才能最有效地讓ChildClass
繼承該方法並使其能夠在調用所述方法時讀取子類的$variable_name
?
經驗法則:如果您的父類需要了解有關子類的任何信息,那么您做錯了。
在設計類或接口時,首先應考慮它們可以執行的actions
(方法)。 不要考慮他們的internal state
(變量)。
要解決您的特定問題,您應首先確定是否需要具有不同的對象狀態或不同的操作。
對於不同的狀態,您可以實現以下內容:
class ParentClass {
private $variable;
function __construct($var) {
$this->variable = $var;
}
function getSomething() {
return $this->variable;
}
}
class ChildClass extends ParentClass {
function __construct() {
parent::__construct('something specific to child class');
}
}
所以,變量是Parent的狀態的一部分,而子對象必須初始化它。
另一種方法是簽訂合同:
abstract class ParentClass {
function getSomething() {
return $this->internalGetSomething();
}
abstract function internalGetSomething();
}
class ChildClass extends ParentClass {
function internalGetSomething() {
return 'something specific to child class';
}
}
所以,internalGetSomething是父母和孩子之間的契約
簡答:你做不到。
答案很長:這不是OO的工作方式。 家長班不了解您的孩子。 你可以做的就是使用Reflection,但這不是要走的路,你需要重新思考你的項目。
class Parent {
public function getSomething(Child $child) {
$reflection = new ReflectionObject($child);
$variable_name = $r->getProperty('variable_name');
$variable_name->setAccessible(true);
return $variable_name->getValue($child);
}
}
就像你說的那樣,ChildClass繼承自ParentClass,而不是相反。 對於ParentClass, $this->variable_name
是一個未知變量。 我建議的一個簡單方法是稍微更改ParentClass方法並在ChildClass中覆蓋它:
class ParentClass
{
public function getSomething($param)
{
return $param;
}
}
class ChildClass extends ParentClass
{
private $variable_name = 'something specific to child class';
public function getSomething($param = "")
{
return parent::getSomething($param = $this->variable_name);
}
}
$object = new ChildClass();
$value = $object->getSomething();
echo $value;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.