2013-04-25 189 views
0

我在想,如果這個語法是正確的:OOP - 類和子類 - 呼叫子方法

在Classes.php:

Class Cart { 

    public $Product; // an object handler will be set on this property 

    public function __construct($user) { 
    // get a product on user's cart (let's say it's only 1 product) - returns $id 
    $this->Product = new Product($id); 
    } 
} 


Class Product { 

    public function __construct($id) { 
    // construct goes here 
    } 

    public function Product_Method() { 
    // product method goes here 
    } 

} 

論文字

$cart = new Cart($user); 
$product_method = $cart->Product->Product_method(); 

它看起來佯裝我,因爲$ product被設置爲Public,並且引用一個對象處理程序。

+0

什麼是Product_method()我在定義中看不到 – 2013-04-25 17:45:11

+0

是什麼問題? – Cooper 2013-04-25 17:47:10

+0

你爲什麼不嘗試在你的計算器?一個有用的相關問題:http://stackoverflow.com/questions/2307097/method-chains-php-oop – 2013-04-25 17:47:21

回答

0

有,你可以通過「正確」的意思是這裏的各種事情。

  1. 語法

    你的語法是正確的。你可以通過運行你的代碼很容易地發現這一點,所以我不確定這是否是你問的。

  2. 正確性

    正如其他人所說,$id不存在構造函數的範圍。這將導致運行時錯誤。

  3. 最佳實踐

    Dependency injection是所有的憤怒,這些天。不鼓勵從構造函數調用new。相反,您會傳入Product對象。請注意,這是有點主觀的,如果這聽起來不必要複雜沒有什麼部隊你這樣做,但至少要知道爲什麼人們反對它,以便你可以做出明智的決定。

    另外,根據您的使用情況,封裝功能可能會更好,以便外部代碼不必知道Product的方法(它只需處理購物車)。也就是說,使$Product專用,並將方法添加到Cart負責調用Product_method()。根據Product_method()的語義(這是Cart應該知道該怎麼做?),這可能有意義或無意義。

+0

也只是一個術語nitpick:'Product'不是「子類」。該術語嚴格地指[繼承](http://en.wikipedia.org/wiki/Inheritance_ \(面向對象的程序設計))。你在做什麼是[作文](http://en.wikipedia.org/wiki/Object_composition)。 – 2013-04-25 18:18:17

+0

親愛的Matt,感謝您的詳細回覆。它完全解決了我的疑問,但給了我想想問題的另一個方面。關於依賴注入,我可以請你澄清這段話:「相反,你會傳入你的產品對象」。我沒有看到提出的「出路」。 – 2013-04-25 18:20:33

+0

從我寫這篇文章開始,看看你的新評論和編輯,你的確在問語法。 [如果你得到錯誤](http://stackoverflow.com/questions/16221318/oop-classes-and-subclasses-call-subclass-method/16221756#comment23200762_16221318)知道它們是什麼會有幫助;也許你應該發佈一個新的,更具體的問題。 – 2013-04-25 18:20:41

0

您在構造函數中使用$ id將它傳遞給new Product($id),但是您從哪裏獲取$ id?而且你只有一個字符串在函數中浮動,沒有回聲或分配給變量。

+0

我沒有放過整個類,因爲疑問與此有效性有關:$ class-> property-> method()。作爲屬性在__construct上創建的對象處理程序 – 2013-04-25 17:58:29

0

$ id是什麼?你需要設置的$ id在構建

Class Cart { 

    public $Product; 

    public function __construct($user,$id) { 
    "get a product on user's cart (let's say it's only 1 product)" 
    $this->Product = new Product($id); 
    } 
} 

,並在你的代碼

$cart = new Cart($user,$id); 
$product_method = $cart->Product->Product_method();