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

时间:2011-03-30 10:21:21

标签: php oop zend-framework inheritance

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

我原来的问题是以下伪代码(控制器及其父级)无法正常工作:

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';
    }
}

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


原始问题

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

更新

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

3 个答案:

答案 0 :(得分:5)

您的子课程不会调用父构造函数。这是一个修复:

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

更新:家长班'构造函数不会在PHP中自动调用。请参阅documentation

  

注意:父构造函数不是   如果子类隐式调用   定义构造函数。为了运行   父构造函数,调用   子节点中的parent :: __ construct()   构造函数是必需的。

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

答案 1 :(得分:1)

问题是你的Child类没有调用基础构造函数。

顺便说一下,Parent不是PHP中的有效类名。为清楚起见,我更改了类名。见下文:

class ChildClass extends ParentClass {
   public function __construct() {
       parent::__construct(/* what goes here? */);
       echo $this->some;
   }
}

但请注意what goes here?部分:您的基类需要对要构造的OtherClass实例的引用。因此,从ChildClass IS-A ParentClass开始,它还需要以某种方式获取此类实例。您需要向ChildClass::__construct添加参数并将值转发给parent::__construct,或者以某种方式自行计算出默认值。

答案 2 :(得分:1)

使用控制器构造注入任何东西通常是 BAD PRACTICE !问题在于你的设计。 OtherClass是什么类型的对象?是DB适配器吗?它是ACL吗?它是一些助手类吗?

如果您需要控制器中的外部课程,我建议您使用动作助手。这就是为它们创建的;)或者创建一个动作助手,在需要时从某个地方获取这个OtherClass。

你绝不应该使用__construct()来完成你的任何肮脏工作。这就是init()的用途。但它没有任何障碍。并且有一个原因 - 再次 - 你不应该像这样注入依赖项;)

<强>更新 请注意,您的类使用不鼓励的PHP4成员变量定义语法。尝试将var替换为protected