这是代码布局大纲,所有这些都很好地布置在3个文件和类中
$aa = new className();
class className {
/**
* Constructor
*/
function className() {
$this->init_SubClass();
}
function init_SubClass() {
require_once('sub_class.class.php');
$sub_class = new sub_class();
}
}
Run Code Online (Sandbox Code Playgroud)
sub_class.class.php
class sub_class {
/**
* Constructor
*/
function sub_class() {
$this->init_Sub_Sub_Class();
}
function init_Sub_Sub_Class() {
require_once('Sub_Sub_Class.class.php');
$Sub_Sub_Class = new Sub_Sub_Class();
}
}
Run Code Online (Sandbox Code Playgroud)
sub_sub_class.class.php
class Sub_Sub_Class {
public function function_I_to_call() {
echo ' show this text'
}
}
Run Code Online (Sandbox Code Playgroud)
如何调用function_I_to_call()
到目前为止,这是最好的猜测
$aa->className->sub_class->function_I_to_call()
Run Code Online (Sandbox Code Playgroud)
不知道如何做到这一点或是否可以做到.
非常感谢
您没有将新创建的对象分配给实例.你需要使用
$this->sub_class = new Subclass;
Run Code Online (Sandbox Code Playgroud)
这将使他们成为公共财产,然后你可以使用你的
$aa = new className;
$aa->sub_class->function_I_to_call();
Run Code Online (Sandbox Code Playgroud)
但是,整个方法完全有缺陷:
__construct.旧样式构造函数是PHP4的遗留物,不能使用命名空间类.require使用自动装带器时不需要呼叫.替代方法
class Foo
{
protected $bar;
public function __construct(Bar $bar)
{
$this->bar = $bar;
}
public function getBar()
{
return $this->bar;
}
}
Run Code Online (Sandbox Code Playgroud)
然后 Bar
class Bar
{
protected $baz;
public function __construct(Baz $baz)
{
$this->baz = $baz;
}
public function getBaz()
{
return $this->baz;
}
}
Run Code Online (Sandbox Code Playgroud)
而且Baz:
class Baz
{
public function fn()
{
return 'called';
}
}
Run Code Online (Sandbox Code Playgroud)
然后通过以下方式组装:
$foo = new Foo(new Bar(new Baz));
Run Code Online (Sandbox Code Playgroud)
或者将该代码移动到Factory:
class FooFactory
{
public function create()
{
return new Foo(new Bar(new Baz));
}
}
Run Code Online (Sandbox Code Playgroud)
最后,Autoloader(简化):
spl_autoload_register(function($className) {
$classMap = array(
'Foo' => '/path/to/Foo.php',
'Bar' => '/path/to/Bar.php',
'Baz' => '/path/to/Baz.php',
);
require $classMap[$className];
});
Run Code Online (Sandbox Code Playgroud)
然后你可以打电话(演示)
$fooFactory = new FooFactory;
$foo = $fooFactory->create();
echo $foo->getBar()->getBaz()->fn();
Run Code Online (Sandbox Code Playgroud)
但你不应该(除非它是某种DSL),因为这违反了得墨忒耳法,因为你正在深入挖掘合作者.