在类属性中扩展类?

时间:2016-08-05 15:49:21

标签: php

假设我是这堂课:

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

现在我在控制器中包含了类foo($ name),如下所示:

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');

1 个答案:

答案 0 :(得分: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!');
    }
}