2013-04-09 105 views
0

我對Opencart oo編程感興趣。將公共財產從一個班級應用到另一個班級

在Opencart的,不受任何控制文件中,我們可以很容易地看到這樣的編程風格: -

class ControllerAccountAddress extends Controller { 
    private $error = array(); 
    public function index() { 
      if (!$this->customer->isLogged()) { 
       $this->session->data['redirect'] = $this->url->link('account/address', '', 'SSL'); 
} 

我所看到的,ControllerAccountAddress類中,作者可以立即分配其他類生成的屬性,它在最少不是來自擴展的Controller類或在同一個php頁面中。因此,我懷疑,其他類創建的一些公共屬性可用於這種「索引」方法。

然而,當我嘗試另一個類是這樣的: -

<?php 
class Language{ 
    public $lang; 

    function __construct($the_lang) { 
     $this->lang = $the_lang; 
    } 

    function get_lang(){ 
     echo $this->lang; 
    } 
} 
?> 

<?php 
$try = new Language('English'); 
$try->get_lang(); 
?> 

結果將是 「英語」。

然後,我試圖創建另一個類: -

<?php 
class Person { 
    public $name; 
    function trial() { 
     $something = $this->lang . "OK"; 
    } 

} 
?> 

然後,不管我如何努力,在$這個 - >郎不能用了,我懷疑它有沒有提供給此方法。

我該怎麼做才能生成可用於其他類方法的屬性?

+1

要訪問類人員中的語言屬性,您需要將其擴展I.e. class Person extends Language – 2013-04-09 11:55:33

回答

1

$this->lang不能因爲這麼想的有$lang財產Person對象使用。 當一個班級由其他班級組成時,你所需要的就是所謂的組合。 基本上這意味着一個對象具有保存另一個對象的屬性。

所以你想要組合,你需要依賴注入來啓用它。

對於人使用的語言,你需要這樣的:

class Person { 
    public $name; 
    public $lang; // This is object! 

    public function __construct($lang) { 
     $this->lang = $lang; 
    } 
} 

$lang = new Language(); 
$john = new Person($lang); 

現在你可以像這樣訪問語言:

$jonh->lang->method(); 

這個例子展示瞭如何通過對象構造使用依賴注入推對象。請閱讀關於組合和依賴注入的更多信息。

希望這會有所幫助!

0

班人與語言沒什麼共同之處,所以您不能在其中使用$lang

但是...

你可以有一個字段,例如:在類Person$mother_language這樣

class Person { 
    public $name; 
    public $mother_language; 

    function __construct(){ // just to initialize $mother_language 
    $this->mother_language = new Language('English'); 
    } 

    function trial() { 
    $something = $this->mother_language->lang . "OK"; 
    } 
} 
+2

你永遠不應該在對象構造器中實例化一個新的對象,依賴應該從外部推送,所以任何使用這個類的人都知道這個類依賴於什麼! – Matija 2013-04-09 12:03:09

+0

@Matija你可以看看我的問題嗎? HTTP://計算器。com/questions/15901861/why-not-instantiate-a-new-object-object-constructor – Voitcus 2013-04-09 12:27:00

+0

是的,我看了你的問題,我仍然可以告訴你,它更好地使用依賴注入然後實例化對象在構造函數中。如果你做過任何單元測試,你應該知道這一點。當你在構造函數中實例化依賴時,你不能使用模擬對象等等...... – Matija 2013-04-09 12:45:38

相關問題