Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在类属性中扩展类?_Php - Fatal编程技术网

Php 在类属性中扩展类?

Php 在类属性中扩展类?,php,Php,假设我上过这门课: class Loader { function library($name) { require $name . '.php'; } } 现在我将类foo($name)包含在我的控制器中,如下所示: class Controller { function __construct() { $this->load = new Loader(); } } class Child_

假设我上过这门课:

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();
    }
}
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!');
    }
}
例如,是否可以访问
$this
中包含的类?比如:

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

    function init()
    {
        $this->print('some text');
    }
}
其中,
print
foo
的一种方法,该类包括:

class Foo
{
    function print($message)
    {
         echo "your message: " . $message;
    }
}
所以,求和,我想在子控制器中,在
$this
中,包含由基础控制器扩展的加载程序类所包含的类的所有方法。这可能吗

或者另一个想法是在Child_控制器中动态创建一个属性,该属性采用所包含类的名称,因此,对于调用
foo
方法,我可以执行如下操作:

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

不,您不能这样做,但是您可以在通用属性中存储
Foo
类似的操作,如下所示:

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

class Child_Controller extends Controller
{
    function __construct()
    {
         parent::__construct();
         $this->load->library('foo'); 
         init();
    }
}
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!');
    }
}
如果要实例化多个库,则不应使用变量的动态名称,而应使用库名称作为键的数组,如下所示:

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

class Child_Controller extends Controller
{
    function __construct()
    {
         parent::__construct();
         $this->load->library('foo'); 
         init();
    }
}
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!');
    }
}
如果不能使用数组,并且必须使用变量名,则可以这样做:

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

class Child_Controller extends Controller
{
    function __construct()
    {
         parent::__construct();
         $this->load->library('foo'); 
         init();
    }
}
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!');
    }
}

不,那是不可能的。此外,您可能会与相同的命名类方法发生冲突。创建一个新属性并将其指定为类的实例。是的,您可以。但这需要很多工作。实际上,autoload/composer是您正在寻找的。嗯,我喜欢这个例子,有一个问题:我在代码中尝试了这个,但不幸的是我得到:
致命错误:调用成员函数在null上打印,可能在
库中
函数中我需要返回include?是的,
函数需要返回实例化的类。好的,非常感谢。我现在唯一的问题是。如果我这样做:
var_dump($this->libs['foo'])我得到:
int(1)
在这个调用中,
$this->libs['foo']->print()
我会得到这个错误:
调用一个成员函数handleLogin()。似乎返回的是整数而不是类?发生了什么事?再次感谢。