簡體   English   中英

使用子類構造函數時,PHP保留父類屬性

[英]PHP Keep parent class properties when using a child class constructor

我有一個父類Database ,如下

class Database{

    /** @var Object Filemaker object across the application*/
    protected $fm = null;
    public function __construct(){

        if($this->fm == null){
            $this->_openConnection();
        }
    }

    /**
     * Function to open connection to FileMaker
     * @return null
     */
    private function _openConnection(){
        $this->fm = new FileMaker();
    }
}

我的一個孩子班是

class Login extends Database{

    public function validate(){
        // $this->fm is accessed here with no constructors
        print_r($this->fm);
    }
}

我正在創建對象

$login = new Login();
$login->validate();

請注意,在此Login類中,我沒有任何構造函數。 因此,在$login = new Login(); 它正在調用Database類的構造函數,並調用_openConnection()。 這可以

這是我的另一個孩子班:

class PouleManipulation extends Database{
    private $year;
    public function __construct(){
        // $this->fm is only accessed if I call parent class constructor
        parent::__construct(); 
        $year = '2015';
    }

    public function processQueue(){
        $this->fm->perform();
    }
}

$pm = new PouleManipulation();
$pm->processQueue();

現在,當我調用$pm = new PouleManipulation(); ,請注意,我有一個此類的構造函數。 如果我訪問$this->fm ,則拋出未定義的錯誤。 我搜索了一下,發現

在這個類的構造函數中,我需要使用parent::__construct(); 訪問父類的屬性。 如果我不使用parent::__construct(); 那么當您在子類中有構造函數時,父類對象將不可訪問

現在,問題出在數據庫類$ fm為空,並且它再次調用_openConnection()。 我總共有10個類擴展了Database類,而無論哪個類都有構造函數,它都調用_openConnection()

我只需要一次調用_openConnection()就可以在所有子類中訪問$ this-> fm,並且在所有類中都需要$ this-> fm。 您如何實現的?

讓我們澄清一下。 這些屬性是在對象級別上設置的。 這意味着,每次實例化創建對象的類時,該對象都是新對象,並且其屬性與實例化的其他對象不同(它們可能具有相同的值,但是它們存儲在不同的位置並且是獨立的)。

例:

class Database {
    public $fm = "Value";
}

class Login extends Database {}

class PouleManipulation extends Database {}


$a = new Login();
$b = new PouleManipulation();
$b->fm = "New Value";
echo $a->fm; // prints "Value"
echo $b->fm; // prints "New Value"

您要查找的是靜態屬性,該屬性在類級別設置。 最好通過靜態方法訪問它。 這是一個簡單而骯臟的示例,但是您最好使用getter和setter。

class Database {
    public static $fm = "Value";
}

class Login extends Database {}

class PouleManipulation extends Database {}

$a = new Login();
$b = new PouleManipulation();
$b::$fm = "New Value";
echo $a::$fm; // prints "New Value"
echo $b::$fm; // prints "New Value"

編輯:我使用您提供的代碼來解釋如何實現所需的內容,但我想強調一下Ryan Vincent在評論中寫的內容: Login類應使用(而不是擴展) Database

暫無
暫無

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

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