2014-12-07 62 views
-2

我想在父類中使用子類屬性,但我無法得到結果。我在子類中使用構造函數。也許有人可以解釋,我怎麼能做到這一點?我會在下面留下一些評論代碼。謝謝!PHP OOP強制子類看父類屬性

Class DataBase extends Main { 

    public $email, $password1, $password2; 

    function __construct($email,$password1,$password2) { //this is my child class with properties 

     $this->email = mysql_real_escape_string($email); 
     $this->password1 = mysql_real_escape_string($password1); 
     $this->password2 = mysql_real_escape_string($password2); 

    } 
} 

Class Main{} //this is my parent class. I want to use DataBase class properties here. 

EDITED最後一個問題是地獄錯誤的。

+1

是的,...?只需在你的孩子中使用'$ this-> email'!! – deceze 2014-12-07 13:12:53

+0

每個被定義爲受保護或公共的成員都可以在子類中訪問。只有私人成員不能直接訪問 – DarkBee 2014-12-07 13:15:57

+0

O gosh,我做錯了。我想要的只是讓父類擴展子類參數; x。 – 2014-12-07 13:37:11

回答

0

如果將您的屬性設置爲public,則您應該能夠訪問父類中的子屬性,因爲您始終使用PHP中的實際對象。但是,在OOP中這是一件很糟糕的事情。如果你有另一個孩子班,你可能沒有這些特性。這是一個純粹的OOP反模式。

編輯:

當你做你$obj_suc = new Main($input_email, $input_password1, $input_password2);實例化類Main。由此產生的對象$obj_suc不知道有關類DataBase的任何內容。絕對沒有。如果你想實例化類DataBase,你必須做$obj_suc = new DataBase($input_email, $input_password1, $input_password2);。如果您希望我們幫助您重構,我們需要從MainDataBase(例如使用子屬性的1個方法)獲得更多的代碼。我們還需要你的代碼$obj_suc = new Main($input_email, $input_password1, $input_password2);

+0

我的主要問題是,如果我通過父類實例設置對象,我無法訪問子類方法。所以我決定通過子類來設置對象,但現在我的父類看不到子類的屬性。也許你有一個建議? – 2014-12-07 15:51:22

+0

你的父母不應該訪問你的孩子的財產。讓我看看你的原始代碼,並給我兩個類的構造函數(如果兩個類都有一個)。請注意,您不能使用'$ main = new Main();'實例化'DataBase'類,所以在這種情況下,您將不具有任何'DataBase'屬性。 – Gnucki 2014-12-07 16:17:49

+0

我在我的問題中只有1個構造函數,而在父類中沒有。我設置了這樣的實例$ obj_suc = new Main($ input_email,$ input_password1,$ input_password2);我可以達到我的父類方法,但每當我的父類方法需要從子類(我通過構造函數)的值我得到一個錯誤。我問我必須重構我的代碼。但仍然不知道如何。 – 2014-12-07 16:28:39

0

您應該可以輕鬆訪問這些變量,因爲它們具有訪問修飾符「public」,這意味着它們可以全局訪問。例如

<?php 

$dbc = new Main('val1', 'val2', 'val3'); 

echo $dbc->email, ' ', $dbc->password1, ' ', $dbc->password2, PHP_EOL; 

這個片段將做工精細

編輯:我還想補充一點,積極的MySQL連接或MySQL的可用資源將被要求使用mysql_real_escape_string功能。

+0

'Main'的一個對象不是'DataBase'的一個實例。 「DataBase」的一個對象是「Main」的一個實例。你應該使用'$ dbc = new DataBase('val1','val2','val3');'而不是'$ dbc = new Main('val1','val2','val3');'。此外,我認爲這個問題是關於在父類中訪問兒童財產,而不僅僅是訪問公共財產。 – Gnucki 2014-12-07 15:04:27

0

你應該重構代碼,以更多的東西是這樣的:

<?php 
    class Foo { 
     public $var1, $var2; 

     public function __construct($v1, $v2) { 
     $this->var1 = $v1; 
     $this->var2 = $v2; 
     } 
    } 

    class Main { 
     private $foo = null; 
     public function __construct(Foo f$) { 
     $this->foo = $f; 
     } 
     public function getChildMembers() { 
     if ($this->foo == null) return; 
     return array($this->foo->var1, $this->foo->var2); 
     } 
    } 

    $foo = new Foo('Bar', 'FooBar'); 
    $main = new Main($foo); 
    var_dump($main->getChildMembers());