2009-11-29 70 views
1

我:參考與改寫

class A{ 

    public $name = 'A'; 
    public $B; 

    public function B_into_A($b) 
    { 
     $this->B = $b; 
    } 
} 

class B{ 

    public $name = 'B'; 
    public $A; 

    public function new_A_into_B($a) 
    { 
     $this->A = new $a; 
    } 
} 

$a = new A; 
$b = new B; 
$a->B_into_A($b); 
$b->new_A_into_B('A'); 

這是在運行時的開頭插入一個「主」類中其他類的好辦法? 我應該使用參考嗎?

(背景:我目前在一個MVC框架中,我有一些主要的類內處理很多類,例如引導程序,封裝,模塊,適配器等工作)

回答

2

Yes和No ...

你的第一個函數調用是很好,我只想用一個更標準名稱:

$a = new A; 
$b = new B; 
$a->setB($b); // B_into_A is a little bit of a whacky function name 

你的第二個電話,它並沒有真正意義的傳遞一個字符串,然後創建對象(除非你正在尋找某種factory)。如果你想B到自己的:

$b->new_A_into_B(new A); 

public function new_A_into_B($a) 
{ 
    $this->A = $a; 
} 

同樣,我不喜歡標識可能與setA()裏去以及名稱..。

+0

是的,當然,我希望將class :: factory()作爲方法名稱。我只是拿這個糟糕的名字來表達清楚我的意思;) 謝謝btw。 –

1

傳遞一個對象而不是它的類名是有道理的,因爲這樣垃圾收集器就可以更容易地猜測它什麼時候不再需要了。

<?php 

class A { 
    public $B; 
} 

class B { 
    public $A; 
} 

$a = new A; 
$b = new B; 

$a->B = $a; 
$b->A = $b; 

此外,我會嘗試擺脫setter方法。實際上,他們提供的唯一好處是驗證輸入。由於這裏不是這種情況,我建議你直接分配這些類。

您問「我應該使用參考嗎?」。實際上,自PHP5以來,所有對象都通過引用傳遞。獲得其精確副本的唯一方法是使用克隆關鍵字。

順便說一下,您不需要在每個對象中存儲類名稱。只需使用get_class()。

+0

感謝您的「get_class()」功能;) –