【问题标题】:Multi-level inheritance in PHP classesPHP 类中的多级继承
【发布时间】:2016-10-24 15:48:27
【问题描述】:

假设我有这个代码:

class A {
   ...
}

class B extends A {
   ...
}

class C extends B {
   ...
}

$c = new C();
$c->getMethodOrPropertyFromB()->getMethodOrPropertyFromA();

除了糟糕的架构或糟糕的设计之外,这会对脚本执行时的 PHP/Webserver (Apache/Nginx) 性能产生任何影响吗?

如果不建议在 PHP 类中设置这样的多级,您能解释一下原因吗?

注意:除了我得到的答案之外,我还会在此处提供this,这也很有帮助

【问题讨论】:

  • 对我来说似乎很好,但这个例子非常狭窄。
  • 我可能不会担心性能影响,除非您深入嵌套(阅读:不切实际)继承,或者您的类的内容非常密集。如果您的应用程序的设计要求有(即)20 级继承,那就这样吧。根据您的需要,最终可能会在可维护性/可读性和性能之间进行权衡。
  • 谁说这是不好的做法? (你能链接一些来源吗?)
  • @Al.G.我在某处读过它,只是不记得确切的页面;)

标签: php oop architecture php-7


【解决方案1】:

我最初的想法是这可能不利于继承,但经过测试似乎还可以。但是,您可以了解其他实现此目的的方法。

抽象类或接口可能有意义。

抽象类和其他类一样,但它们不能被实例化。还有一些抽象方法必须由具体类来实现。

abstract class A {
    //You can also have abstract methods
    abstract public function doFoo();
    abstract public function doBar($when);

    //Also implemented method which when
    //called unless overridden will use this logic
    public function sayHi(){
        echo "hi";
    }
}

现在这个类可以选择实现抽象方法或者不添加它需要的任何进一步的逻辑。

abstract class B extends A {
    public function doFoo(){
        //Some code
    }
    abstract public function doFooBar();
    public function sayBye(){
        echo "bye";
    }
}

这是一个具体的类,所有抽象方法都必须在这里实现,如果已经实现的抽象方法不能再次被覆盖。

class C extends B {
    public function doFoo(){
        //Some different code
    }
    public function doBar($when){
        //Some code
    }
    public function doFooBar(){
        //Some code
    }

    //do not need sayHi() and  sayBye() but they will be available.
}

简单粗暴的接口就是一堆方法。您只是告诉开发人员您是否要使用这些工具。这些方法没有声明为抽象,但不能在接口中实现。

interface iA {
    public function doFoo();
    public function doBar();
}

一个接口可以被其他接口扩展,只是在接口上增加更多的方法

interface iB extends iA {
    public function doFooBar();
}

interface iC {
    public function doAnything();
}

并由类实现

class A implements iA{
    public function doFoo(){
        //Some Code
    }
    public function doBar(){
        //Some Code
    }
}

class B implements iB{
    public function doFoo(){
        //Some Code
    }
    public function doBar(){
        //Some Code
    }
    public function doFooBar(){
        //Some Code
    }   
}

接口的附加优势是一个类或抽象可以实现多个

abstract class C implements iA, iC {
    public function doFoo(){
        //Some Code
    }
}

class D extends C {
    //get doFoo() from C implementation and must implement the remaining...
    public function doBar(){
        //Some Code
    }
    public function doAnything(){
        //Some Code
    }
}

【讨论】:

    【解决方案2】:

    这看起来很好。 PHP 只支持单一继承——所以你只能从一个类继承。 如果您需要在类中提供更多功能但无法在父类中获得功能,您也可以考虑使用traits。特征尝试解决单继承问题 - 即使它本身不是问题。

    如果你正确地构建你的类,你会得到一个很好的继承链,它不会对 Apache/Nginx 产生任何不良影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 2014-06-02
      • 2019-03-10
      • 1970-01-01
      相关资源
      最近更新 更多