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()。似乎返回的是整数而不是类?发生了什么事?再次感谢。