PHP 类 中的多级继承
Multi-level inheritance in PHP classes
假设我有这个代码:
class A {
...
}
class B extends A {
...
}
class C extends B {
...
}
$c = new C();
$c->getMethodOrPropertyFromB()->getMethodOrPropertyFromA();
除了 糟糕的 架构或糟糕的设计之外,这会对脚本执行时的 PHP / Web 服务器 (Apache/Nginx) 性能产生任何影响吗?
如果不建议在PHP类中有这样的多级,能解释一下为什么吗?
注意: 除了我得到的答案外,我也会让 this 在这里,这也很有帮助
这看起来非常好。 PHP 仅支持单一继承 - 因此您只能继承一个 class。
如果您需要 class 中的更多功能但无法获得父 class 中的功能,您也可以考虑使用 traits。 Traits 尝试 来解决单一继承问题——即使它本身不是问题。
如果你正确地构建你的 classes 你会得到一个很好的继承链,它不会对 Apache/Nginx.
产生任何不良影响
我最初的想法是这可能不利于继承,但经过测试似乎还可以。但是,您可能知道还有其他实现此目的的方法。
抽象 classes 或接口可能有意义。
抽象 classes 与其他 classes 一样,但它们不能被实例化。还有一些抽象方法必须由具体classes.
实现
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";
}
}
现在这个 class 可以选择实现抽象方法或者不添加它需要的任何进一步逻辑。
abstract class B extends A {
public function doFoo(){
//Some code
}
abstract public function doFooBar();
public function sayBye(){
echo "bye";
}
}
这是一个具体的 class,所有抽象方法都必须在这里实现,如果还没有实现的话,可以再次覆盖。
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();
}
并由 classes
实施
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
}
}
接口的额外优势是 class 或抽象可以实现多个
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
}
}
假设我有这个代码:
class A {
...
}
class B extends A {
...
}
class C extends B {
...
}
$c = new C();
$c->getMethodOrPropertyFromB()->getMethodOrPropertyFromA();
除了 糟糕的 架构或糟糕的设计之外,这会对脚本执行时的 PHP / Web 服务器 (Apache/Nginx) 性能产生任何影响吗?
如果不建议在PHP类中有这样的多级,能解释一下为什么吗?
注意: 除了我得到的答案外,我也会让 this 在这里,这也很有帮助
这看起来非常好。 PHP 仅支持单一继承 - 因此您只能继承一个 class。 如果您需要 class 中的更多功能但无法获得父 class 中的功能,您也可以考虑使用 traits。 Traits 尝试 来解决单一继承问题——即使它本身不是问题。
如果你正确地构建你的 classes 你会得到一个很好的继承链,它不会对 Apache/Nginx.
产生任何不良影响我最初的想法是这可能不利于继承,但经过测试似乎还可以。但是,您可能知道还有其他实现此目的的方法。
抽象 classes 或接口可能有意义。
抽象 classes 与其他 classes 一样,但它们不能被实例化。还有一些抽象方法必须由具体classes.
实现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";
}
}
现在这个 class 可以选择实现抽象方法或者不添加它需要的任何进一步逻辑。
abstract class B extends A {
public function doFoo(){
//Some code
}
abstract public function doFooBar();
public function sayBye(){
echo "bye";
}
}
这是一个具体的 class,所有抽象方法都必须在这里实现,如果还没有实现的话,可以再次覆盖。
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();
}
并由 classes
实施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
}
}
接口的额外优势是 class 或抽象可以实现多个
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
}
}