2011-11-30 59 views
1

一直沒能以相當找到我要找的,雖然主題類似的許多問題......A類負載,並持有B類,想從B類調用方法

例子:

class A { 
    public $_Thing_B; // class B object 
} 

class B { 
    public function printSelf() {} 
} 

構建時,Class A將自己的對應版本Class B拉入其中,該對象用於Class A中的各種私有方法。

但是Class B確實有一些公開的方法,只在代碼中「處理」Class A(因此不直接與獨立實例Class B一起工作)仍然有用。

因此,有時我想做到這一點:

$objA = new A; 
$result = $objA->$_Thing_B->printSelf(); 

,並在我看來,保持這個功能的唯一途徑是通過聲明Class B在裏面Class A公共變量。

這是正確的嗎?還是有辦法保持私密性,同時仍然暴露某些公共方法?

+4

在這種情況下不會繼承更有意義嗎? – NullUserException

+0

同意NullUserException。這種解決方案將來會給您帶來問題。 –

+0

@NullUserException - 我不確定,這是一個揹包/書/頁數問題,如果這使事情更清楚。 – Drew

回答

0

如果你真的需要保留$_Thing_B私人在A,你可以換的B方法,你會在公共方法都需要曝光。我認爲這是奇怪的,雖然,會親自只是不停$_Thing_B作爲公共財產,並直接訪問其方法爲A->B->method()

class A { 
    private $_Thing_B; // class B object is private 

    // Wrap private _Thing_B's methods in public methods: 
    public function print_B() { 
     $this->_Thing_B->printSelf(); 
    } 
} 

$objA = new A(); 
$result = $objA->print_B(); 
0

對於您需要使用ClassB的你可以只創建一個方法的特殊方法

所以不是

$objA->$_Thing_B->printSelf(); 

你叫

$objA->printSelf(); 

和A級的樣子:

class A { 
    private $_Thing_B; // class B object 

    public function printSelf(){ 
     $this->_Thing_B->printSelf(); 
    } 
} 

不要忘了實例B類如在構造函數中但在使用它之前!

0

您可以通過重新實現一些B類方法分爲A類

例如,爲printSelf()方法爲B類對象$_Thing_B創建Adapter,我們可以使用:

class A { 
    private $_Thing_B; 

    public function printSelf() { 
     return $this->_Thing_B->printSelf(); 
    } 
} 

$objA = new A(); 
$result = $objA->printSelf(); 
0

這適合我。

$a = new A(); 
$a->_Thing_B->printSelf(); 

class A { 
    public $_Thing_B; // class B object 

    public function __construct() 
    { 
     $this->_Thing_B = new B(); 
    } 
} 

class B { 
    public function printSelf() 
    { 
     print_r("This is Class B::printSelf()"); 
    } 
} 

但你也可以做到這一點,這可能是更好的辦法: -

$a = new A(); 
$a->getThingB()->printSelf(); 

class A { 
    private $_Thing_B; // class B object 

    public function __construct() 
    { 
     $this->_Thing_B = new B(); 
    } 

    public function getThingB() 
    { 
     return $this->_Thing_B; 
    } 
} 

class B { 
    public function printSelf() 
    { 
     print_r("This is Class B::printSelf()"); 
    } 
} 

兩個選項使輸出"This is Class B::printSelf()"

因此,private變量$_Thing_Bpublic曝光方法getThingB()

相關問題