簡體   English   中英

實例化子類時調用靜態父方法

[英]Calling a static parent method while instantiating child class

我正在改變類結構,以將常見的數據庫方法存儲在一個類中。 然后從子類擴展它。 這樣可以減少代碼,但也允許我在需要時覆蓋父方法。

我已經完成了以下操作,對於本示例,與包含更多類的原始代碼相比,我簡化了基礎知識。

class parent_object{
    private $table_name;

    public function all_records(){
        $sql = "SELECT * FROM ".$this->table_name;
        return $this->execute_sql($sql);
    }
}

class child_object extends parent_object{
    protected static $table_name="tbl_name";

    public function __construct(){
        parent::__construct(self::$table_name);
    }
}

我想靜態調用all_records()來保存自己每次創建一個新對象的過程。

我被困必須實例化孩子,然后調用父方法

$child = new child_object();
$all = $child->all_records();

我真正想要能夠靜態調用父方法的東西:

$all = child_object::all_records();

我理解為什么我無法使用我的代碼來完成此操作,但是希望孩子先實例化然后訪問父方法的某種方式。

我可以在child_object中編寫all_records()方法以實例化自身並調用父級all_records(),但這種做法無法達到擴展目的,以減少代碼和子類中的相同方法。

我確信它非常簡單,或者某些新的高級oop函數可以做到。

謝謝你的幫助。

答案是相對簡單的,您可以將所有屬性轉換為靜態屬性,然后使用static::而不是self::

http://php.net/manual/en/language.oop5.late-static-bindings.php

但是,以這種方式解決問題被認為是一種不好的做法。 祝好運。

您可以執行以下操作:

class child_object extends parent_object
{
    protected static $table_name="tbl_name";

    public static function factory()
    {
        return new child_object();
    }

    public function __construct()
    {
       parent::__construct(self::$table_name);
    }
}

然后,當您使用它時,您只需執行以下操作:

$all = child_object::factory()->all_records();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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