Php 你能解释一下Zend';什么是动作控制器?
很抱歉不断地重新编辑我的问题,但看起来这是正确提问的唯一方法 我最初的问题是以下伪代码(控制器及其父级)没有按我所希望的那样工作:Php 你能解释一下Zend';什么是动作控制器?,php,oop,zend-framework,inheritance,Php,Oop,Zend Framework,Inheritance,很抱歉不断地重新编辑我的问题,但看起来这是正确提问的唯一方法 我最初的问题是以下伪代码(控制器及其父级)没有按我所希望的那样工作: class Parent { var $data = array(); public function __construct( OtherClass $otherClass ) { $this->data = $otherClass->getData(); //contains some => thing
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';
}
}
帮了我很多(谢谢),并指出Zend\u Controller\u Action
正在做我想做的事,但我不明白他们是怎么做的?
原始问题 我知道这里有一些类似的问题,但我不能抛开它们。我还知道我可以反转整个过程,这样我可以先初始化子对象,然后调用
父对象::\u construct
,但这对我来说似乎不需要。在我的情况下,如何轻松访问父变量
更新:
让我澄清一下
Child
是一个任意控制器<代码>父级是所有控制器的母级。许多框架都在做同样的事情,但是控制器可以利用它们的父控制器变量、方法或对象,而无需调用父::_construct
(从而用不必要的参数填充子类构造函数)。我不想重写这些框架,但我想了解它们是如何运行的。您的子类不调用父构造函数。这里有一个解决方案:
class Child extends Parent {
public function __construct() {
parent::__construct();
echo $this->some;
}
}
更新:在PHP中不会自动调用父类的构造函数。见:
注意:父构造函数不是
如果子类
定义一个构造函数。为了跑
父构造函数,调用
父项::\子项中的构造()
构造函数是必需的
所以你所要求的不会发生。要么你误解了类结构,要么他们是如何运作的。请注意,PHP还支持传统构造函数命名(至少在5.3.3之前是这样):如果类中没有_construct()方法,PHP会假定构造函数是以类命名的(即类Foo{function Foo(){})处理Foo()的方法作为构造函数)。问题是您的
子类不调用基构造函数
顺便说一句,Parent
在PHP中不是有效的类名。为了清楚起见,我更改了类名。请参见以下内容:
class ChildClass extends ParentClass {
public function __construct() {
parent::__construct(/* what goes here? */);
echo $this->some;
}
}
但是,请注意这里是什么?
部分:基类需要对要构造的其他类
实例进行引用。因此,由于子类
父类
,它也需要以某种方式获得这样的实例。您需要向子类添加一个参数::\u construct
和将值转发给父对象::u construct
,或者自己找出一个默认值。使用控制器的构造注入任何东西通常是一种不良做法。问题在于您的设计。OtherClass是什么类型的对象?它是DB适配器吗?它是ACL吗?它是某个助手类吗
如果您的控制器中需要外部类,我建议使用action helper。这就是创建它们的目的;)或者创建一个action helper,在需要时从某处获取这个其他类
你永远不应该使用_construct()来做任何脏活。这就是init()的用途。但是它没有参数。这也是一个原因——同样——你不应该像这样注入依赖项;)
更新:
注意:您的类使用了不推荐的PHP4成员变量定义语法。请尝试将
var
替换为protected
您尚未在该代码中将$some
声明为属性。此外,您还需要显式调用父构造函数。尚未声明?我希望通过\uu get
访问它。否,因为parent有一个magic u get方法,它将检查$data属性而不是$some本身这是设置数据的地方。您需要显式调用它,否则数据数组将为空。它永远不会工作,必须调用父构造函数,它与任何其他函数一样是一个函数,因此您可以添加父::\u构造函数($OBJECT)在子构造函数中,您可以删除子构造函数,以便自动调用父构造函数。$this->数据从未初始化,也从未传输。@fabrik:猜猜您应该做什么,才能使其正常工作。这应该不是很难弄清楚。@fireeyedboy您的意思是给子构造函数提供其他类吗?@fabrik:没错!:)并将其传递给父构造函数。@fabrik:如果这不可能,那么您应该重新考虑您的设计。因为在这种情况下,子构造函数将很难再被视为父类的逻辑后代。(或者更确切地说:继承类的逻辑扩展)@fireeyedboy我希望我在原始问题中的更新可能有助于我实现/理解的目标。谢谢你的回答,但你能再解释一点吗?我知道(有经验)这是一个不好的做法,但我不知道如何解决这个问题。我现在在设计中真的很困惑(直到你回答:OtherClass是什么类型的对象?它是DB适配器吗?它是ACL吗?它是某个助手类吗?
:)@TomášFejfarOtherClass
是一个前端控制器,它保存所有路由数据、参数等。基本上我想把它传递给父级,因为从那时起,父级
(当然,Child
也一样)会了解他们周围的一切。FrontController不应该是唯一一个单身的好例子吗?:@TomášFejfar我的front controller是单身的,但这就是为什么我想把它传给我的“action controller”(家长)的原因。