调用php中类中创建的类的函数

Pbe*_*rne 1 php oop

这是代码布局大纲,所有这些都很好地布置在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)

不知道如何做到这一点或是否可以做到.

非常感谢

Gor*_*don 5

您没有将新创建的对象分配给实例.你需要使用

$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)

但是,整个方法完全有缺陷:

替代方法

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),因为这违反了得墨忒耳法,因为你正在深入挖掘合作者.