gpt4 book ai didi

php - 我可以强制子类使用父类的构造函数吗?

转载 作者:可可西里 更新时间:2023-11-01 12:26:18 24 4
gpt4 key购买 nike

我正在学习 PHP,并在试图弄清楚为什么未调用构造函数时发现了一些令人惊讶的行为。

<?php
class Shape {

function __construct() {
echo 'Shape.';
}
}

class Triangle extends Shape {

function __construct() {
echo 'Triangle';
}
}

$tri = new Triangle();
?>

我习惯了 java,所以我认为这会输出“Shape.Triangle”。令人惊讶的是,它只输出“三角形”。我搜索了这个问题,显然我可以通过将 parent::__construct(); 放在子类中来解决它,但这似乎并不理想。我可以对 Shape 类做些什么来确保子类总是调用父构造函数吗?只要父级有构造函数,我真的必须在每个子级的类中编写 parent::__construct(); 吗?

最佳答案

从 PHP 5 开始,您可以使用 final keyword以防止父方法被覆盖。

<?php
class BaseClass {
public function test() {
echo "BaseClass::test() called\n";
}

final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}

class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called\n";
}
}
// Results in Fatal error: Cannot override final method BaseClass::moreTesting()

您可以将它与预定义的 init() 方法结合使用,以确保调用您的父构造函数。

<?php
abstract class Shape {

final function __construct() {
$this->init();
echo 'Shape.';
}

abstract public function init();
}

class Triangle extends Shape {

function init() {
echo 'Triangle';
}
}

$tri = new Triangle();

这会输出

TriangleShape.

如果记录 init() 方法的作用以及它在父级中的调用位置,建议仅使用这样的设计。

关于php - 我可以强制子类使用父类的构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4121103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com