2016-08-05 101 views
2

假設我有這個類:在類屬性中擴展類?

class Loader 
{ 
    function library($name) 
    { 
      require $name . '.php'; 
    } 
} 

,現在我包括類foo($名)我的控制器內,像這樣:

class Controller 
{ 
    function __construct() 
    { 
     $this->load = new Loader(); 
    } 
} 

class Child_Controller extends Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     $this->load->library('foo'); 
     init(); 
    } 
} 

是可能的,例如,訪問包含在$this裏面的類?像:

class Child_Controller extends Controller 
{ 
    //..construct above.. 

    function init() 
    { 
     $this->print('some text'); 
    } 
} 

其中printfoo方法,類包括:

class Foo 
{ 
    function print($message) 
    { 
     echo "your message: " . $message; 
    } 
} 

所以,總結,我想包括在兒童控制器,在$this,包括類的所有方法由基本控制器擴展的Loader類。這可能嗎?

或者另一個想法是在Child_Controller,即採取包括類的名稱的屬性動態創建,所以,對於呼叫foo我可以這樣做的方法:

$this->Foo->print('some text'); 
+0

不,這不可能。你也可能會碰到相同的命名類方法。創建一個新的屬性併爲其分配一個類的實例。 –

+0

是的,你可以。但它需要很多工作。其實,自動加載/作曲家就是你要找的東西。 – felipsmartins

回答

0

不,你不能這樣做,但你可以做在一個通用的屬性這樣的存儲Foo類似的東西:

class Child_Controller 
{ 
    private $lib; 

    function __construct() 
    { 
     parent::__construct(); 
     $this->lib = $this->load->library('Foo'); 
     $this->init(); 
    } 

    function init() 
    { 
     $this->lib->print('Hello World!'); 
    } 
} 

如果你想要實例多個庫,然後,而不是使用動態名稱變量,你應該ü瑟與庫名稱的數組爲關鍵,就像這樣:

class Child_Controller 
{ 
    private $libs = []; 

    function __construct() 
    { 
     parent::__construct(); 
     $this->libs['Foo'] = $this->load->library('Foo'); 
     $this->init(); 
    } 

    function init() 
    { 
     $this->libs['Foo']->print('Hello World!'); 
    } 
} 

如果你不能使用數組和絕對必須使用一個變量名可以是這樣做的:

class Child_Controller 
{ 
    function __construct() 
    { 
     $var = 'Foo'; 
     $this->{$var} = $this->load->library($var); 
     $this->init(); 
    } 

    function init() 
    { 
     $this->Foo('Hello World!'); 
    } 
} 
+0

Uhm我喜歡這個例子,一個問題:我在我的代碼中嘗試這個,但不幸的是我得到:'致命的錯誤:調用成員函數打印null',也許在'庫'函數我需要返回包含? – Tekken

+0

是的,庫函數需要返回實例化的類。 – Styphon

+0

好的,非常感謝。我現在只有問題。如果我這樣做:'var_dump($ this-> libs ['foo']);'我得到:'int(1)'並且在這個調用上'$ this-> libs ['foo'] - > print() '我會得到這個錯誤:'調用成員函數handleLogin()在整數'。似乎返回一個整數而不是類?發生什麼事?再次感謝。 – Tekken