2016-08-05 13 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?以下のような:printfooの方法である

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

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

は、クラスが含ま:

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

ので、合計し、私は、$thisで、子コントローラに含める含まれるクラスのすべてのメソッドをしたいですベースコントローラーによって拡張されたLoaderクラスによって呼び出されます。これは可能ですか?

それとも別のアイデア、Child_Controllerに動的に含まれるクラスの名前を取るプロパティを作成し、そう、ためfooのメソッドを呼び出すことになる私のような何かを行うことができます:あなたは、ノー

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

いいえ、それは不可能です。また、同じ名前のクラスメソッドと競合する可能性があります。新しいプロパティを作成し、クラスのインスタンスを割り当てます。 –

+0

はい、できます。しかし、それは多くの作業を必要とします。実際には、オートロード/コンポーザーがあなたが探しているものです。 – felipsmartins

答えて

0

class Child_Controller 
{ 
    private $lib; 

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

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

あなたが複数のライブラリをインスタンス化したい、その後ではなく、変数の動的な名前を使用している場合は、Uべき:あなたはこのような一般的なプロパティにFooの格納に似た何かを行うことができますしかし、それを行うことはできません

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

    function init() 
    { 
     $this->Foo('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!'); 
    } 
} 

は、あなたがこのようなことを行うことができます。このようなキーとしてライブラリ名の配列を、SE

+0

私はこの例が好きです。私はこのコードを試してみましたが、残念ながら次のように表示されます。 '致命的なエラー:メンバー関数を呼び出すとnullになります。'おそらく 'ライブラリ'関数にインクルードする必要がありますか? – Tekken

+0

はい、 'library'関数はインスタンス化されたクラスを返す必要があります。 – Styphon

+0

よろしくお願いいたします。私は今問題があるだけです。これを行うと、 '$ this-> libs ['foo'] - > print()を呼び出すと' $ this-> libs ['foo']) 'このエラーが発生します:'整数のメンバ関数handleLogin()への呼び出し '。戻り値はクラスの代わりに整数を返すと思われますか?何が起きましたか?再度、感謝します。 – Tekken

関連する問題