簡體   English   中英

如何從PHP中的繼承父類方法引用子類變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM