Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 你能解释一下Zend';什么是动作控制器?_Php_Oop_Zend Framework_Inheritance - Fatal编程技术网

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ášFejfar
OtherClass
是一个前端控制器,它保存所有路由数据、参数等。基本上我想把它传递给父级,因为从那时起,
父级
(当然,
Child
也一样)会了解他们周围的一切。FrontController不应该是唯一一个单身的好例子吗?:@TomášFejfar我的front controller是单身的,但这就是为什么我想把它传给我的“action controller”(家长)的原因。