作者tkdmaf (皮皮快跑)
看板PHP
標題Re: [請益] 物件中的物件表示法
時間Mon Mar 18 12:38:31 2013
※ 引述《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