你能解释Zend的Action控制器是如何运作的吗?

fab*_*rik 2 php oop inheritance zend-framework

很抱歉不断重新编辑我的问题,但看起来这是正确询问它的唯一方法.

我原来的问题是以下伪代码(控制器和它的父代)无法正常工作,因为我想:

class Parent {
    var $data = array();
    public function __construct( OtherClass $otherClass ) {
        $this->data = $otherClass->getData(); //contains some => thing
        $this->init($otherClass->getClassName());
    }
    public function init( $className ) {
        new $className; //new Child
    }
    public function __get( $name ) {
        return array_key_exists($name, $this->data) ? $this->data[$name] : null;
    }
}

class Child extends Parent {
    public function __construct() {
        echo $this->some; //won't return 'thing';
    }
}
Run Code Online (Sandbox Code Playgroud)

fireeyedboy帮助了我很多(谢谢),并指出Zend_Controller_Action正在做我想要的但我无法理解他们是如何做到的?


原始问题

我知道这里有一些类似的问题,但我不能抛弃它们.此外,我知道我可以扭转整个过程,所以我可以先初始化Child然后打电话,parent::__construct但这对我来说似乎不需要.Parent在我的情况下如何轻松访问变量?

更新:

让我澄清一下.Child是一个任意的控制器.Parent是所有控制器的母亲.许多框架都在做同样的事情,但是控制器可以在不调用的情况下利用它们的父控制器变量,方法或对象parent::__construct(因此用不必要的参数填充子类构造函数).我不想重写任何这些框架,但我想了解它们是如何运作的.

jmz*_*jmz 5

您的子类不会调用父构造函数.这是一个修复:

class Child extends Parent {
   public function __construct() {
       parent::__construct();
       echo $this->some;
   }
}
Run Code Online (Sandbox Code Playgroud)

更新:不会在PHP中自动调用父类的构造函数.查看文档:

注意:如果子类定义构造函数,则不会隐式调用父构造函数.为了运行父构造函数,需要在子构造函数中调用parent :: __ construct().

所以你问的不会发生.你是否误解了阶级结构或它们的运作方式.请注意,PHP还支持遗留构造函数命名(至少在5.3.3之前):如果类中没有__construct()方法,PHP假定构造函数以类命名(即类Foo {function Foo(){} )将Foo()方法视为构造函数).