PHP PHP构造函数的继承问题

sonte · 2019-11-27 09:46:57 · 热度: 10

关于类继承,总有一个常见的问题,这就是构造函数的使用。

子类实例化时会执行父类的构造函数吗?

如果是这样,倘若子类也有自己的构造函数会怎么样?

子类构造函数在父类构造函数之后执行,还是会覆盖父类的构造函数?

先来看一个简单的例子:

<?php
    class Fruit {
        public function __construct($name)
        {
            echo '水果'.$name.'创建了';
        }
    }

    class Apple extends Fruit {
        public function __construct($name)
        {
            parent::__construct($name);
        }
    }

    $apple = new Apple("苹果");

    // 输出 水果苹果创建了
?>

构造函数的继承节省的是代码的重写,而不是方法的声明,也就是说,在父类中声明的构造函数必须再在子类中声明一次,其实,这也是一个重写的过程。

PHP的构造函数继承必须满足以下条件:

  1. 当父类有构造函数的声明时,子类也必须有声明,否则会出错。
  2. 在执行父类的构造函数时,必须在子类中引用parent关键字。

如果父类有构造函数,而且子类没有构造函数,那么在子类实例化时确实会执行父类构造函数。

例如,假设Employee类有如下构造函数:

function  __construct($name){
    $this->setName($name);
}

然后实例化CEO类,获得其name成员:

$ceo= new CEO("Gonn");
echo $ceo->getName();

将得到如下结果:

My name is Gonn

但是,如果子类也有构造函数,那么当子类实例化时,不论父类是否有构造函数,都会执行子类自己的构造函数。

例如,假设除了Employee类包含上述构造函数外,CEO类也包含如下构造函数:

function  __construct(){
    echo "CEO object created!";
}

再来实例化CEO类,以同样的方式执行getName(),这次将得到不同的输出:

CEO object created!
My name is Gonn

当遇到parent::__construct()时,PHP开始沿着父类向上搜索合适的构造函数。

因为在Executive中没有找到,所以继续搜索知道Employee类,在这里找到了合适的构造函数。

如果 PHP 在Employee类中找到构造函数,就会执行这个构造函数。

如果希望既执行Employee构造函数,又执行Executive构造函数,则需要在Executive构造函数中调用parent::__construct()

此外,还可以选择另一种方式来引用父类的构造函数。

例如,假设创建新的CEO对象时,Employee和Executive的构造函数都要执行。

如上述,可以在CEO的构造函数中显示地引用这些构造函数,如下:

function __construct($name){
    Employee::__constrcut($name);
    Executive::__construct();
    echo "CEO object created!";
}

猜你喜欢:
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册