看板 PHP 關於我們 聯絡資訊
※ 引述《BBSealion (海獅)》之銘言: : 最近在使用PHP寫OO : 但有一點小疑惑 : 我開了兩個class : Class A{ : var $a = 0; : var $aa = 0; : } : Class B{ : var $b = 0; : var $bb = new A; : } : 黃色那行就不讓我過了 : 我其實可以先設他為0,之後再塞一個A物件給他行得通 : 不過我想在Class更明確的表示他必須要吃一個A物件 : 想請教一下這個概念要怎麼寫比較好呢? class aaa{ public $a = 123; public $aa = 456; } class b{ public $obj_a; function __construct(){ $this->set_a_object(new aaa); } function set_a_object(aaa $obj_a){ $this->obj_a = $obj_a; } } $b = new b; echo $b->obj_a->a.'<br>'; echo $b->obj_a->aa.'<br>'; 注意一下,這邊是不走直接建構式。 其實改這樣是ok的: function __construct(aaa $obj_a){ $this->obj_a = $obj_a; } 但差異是一個你在跑主程式時要自己去new。 一個是物件就直接幫你new。 主要差異在那裡? 差異在於如果你載進來的class不叫aaa這個程式就會異常。 你應該是要強制規範進來的物件一定要叫aaa吧。 另外追加補充一點就是: 其實這算是一種指定類別或介面規範。 因為我沒有定義interface而是直接定義class名稱。 所以是強制要求實作class的名稱為aaa。 但如果你的要求是「只要物件本身具備介面要做實作的功能」 就可以改成這樣: interface myaction{ function run(); } class aaa implements myaction{ function run(){ echo 'run'; } } class b{ public $myobj; function __construct(myaction $myobj){ $this->myobj = $myobj; } } $b = new b(new aaa()); $b->myobj->run(); 上面這種情形比較特別在於 你new的東西不一定要是aaa。 但是你的aaa比須遵從myaction的介面規範。 只要任何人都去implements myaction 並且都有實作myaction制定的方法。 那就可以正常執行。 (因為已經定義介面是myaction,故意不去implements myaction的話就會視為錯誤, 而implements myaction之後故意不實做run也會是錯誤) 今日更新(3/19): 1.修正錯別語法應為:implements才對。(少了s) 2.更正內容為: 其實這算是一種指定類別或介面規範。 因為我沒有定義interface而是直接定義class名稱。 (原文:其這算是一種介面規範。因為我沒有定義interface。) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.157.62
MOONRAKER:讚 03/18 18:04
j87b0003:大推 03/18 18:28
BBSealion:推! 這個超清楚 最後一個寫obj-c時常用到原來PHP也OK 03/18 23:43
junktw:簡單明瞭 03/19 11:15
gpmm:指定 class 應該和介面規範無關吧 :P 03/19 13:13
gpmm:不過還是推一個熱心解答 03/19 13:14
tkdmaf:喔!因為我看錯error code,他是寫instance,不是interface 03/19 13:27
※ 編輯: tkdmaf 來自: 220.136.50.24 (03/19 13:33)
dardar923:精華阿~~ 03/21 11:20
yanli2:不M對不起麥當勞ㄚ 03/22 10:57