【问题标题】:using init in php (not related to zend) [closed]在php中使用init(与zend无关)[关闭]
【发布时间】:2012-11-21 22:16:47
【问题描述】:

我对使用 init 的做法有疑问。如果我有一个包含多个子类的父类,并且它们在它们的 init 函数中都有相同的内容,最好将这些内容放在父 init 类中,然后简单地做:

public function init(){
    parent::init();
}

这似乎是合乎逻辑的,但是我读到的每一个地方,不幸的是,这是 zend 特定的,他们说将父类中的 init 方法留空以避免复杂性。

有人可以澄清一下吗?

【问题讨论】:

    标签: php init


    【解决方案1】:

    我认为您将看到的只是编码实践的差异。

    如果所有子类都具有完全相同的init() 方法,那么甚至没有理由在子类中声明该方法。

    在某些情况下,我看到开发人员完全按照您的说明进行操作。在很多情况下,这可能是因为最终的意图可能是以某种特定于类的方式增强父方法的行为。在其他情况下,我看到一些子类的集合覆盖了该功能,因此开发人员在所有子类中放置了一个这样的方法,以便其他开发人员清楚其意图(执行该子类的父方法)。

    【讨论】:

      【解决方案2】:

      等等,什么?如果父类需要一个init 方法,而子类需要完全相同的方法...只需将其添加到父类,而对子类不做任何事情,因为它们会自动继承它。

      这个:

      public function init(){
          parent::init();
      }
      

      最好写成:

       
      

      (是的,那是什么都没有。如果方法所做的只是调用父方法,那就不用了。)

      【讨论】:

        【解决方案3】:

        如果你的子类继承父类而不覆盖父类的方法,那么子类只是继承父类的方法。 Zend 与它无关。

        例子

        class A {
           function foo() {
             echo "foo";
           }
        }
        
        class B extends A {}
        
        $b = new B();
        
        $b->foo();
        

        输出是

        foo
        

        此外,init 不是any magic method。它与foo 的方法相同。 Zend 中使用它的事实来自于它的设计。它可以命名为initializefoo(当然,对于ZF 中的这种方法而言,initfoo 更好)。

        【讨论】:

          【解决方案4】:

          很多 Zend 类都有构造函数,它们在构造函数的末尾调用 init() 函数。这个想法(我假设)是从它们继承的类可以避免调用

          public function __construct(){
              parent::__construct();
          
              //child class logic
          }
          

          IMO 这是不必要的便利。

          无论如何,您想要在子类中调用parent::init() 的唯一原因是它真的是Zend 孙子类,并且它的父类在其init() 中也有一些逻辑。在这些情况下,一个空函数应该调用它的父函数,或者被完全删除。

          【讨论】:

            猜你喜欢
            • 2011-05-25
            • 2011-01-05
            • 1970-01-01
            • 2014-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-10
            • 2014-09-19
            相关资源
            最近更新 更多