ZetCode

PHP extends 关键字

最后修改于 2025 年 4 月 16 日

PHP extends 关键字支持类的继承,这是一个基本的面向对象编程 (OOP) 概念。它允许子类继承父类的属性和方法。继承促进了代码重用和层次结构组织。

基本定义

extends 关键字在类之间创建继承关系。子类(子类)继承自父类(超类)。

继承的成员包括公共和受保护的属性和方法。私有成员不会被继承。子类可以重写父类方法。

语法:class Child extends Parent { ... }。PHP 支持单一继承 - 一个类只能扩展一个父类。

基本继承

此示例演示了使用 extends 关键字的简单类继承。

basic_inheritance.php
<?php

declare(strict_types=1);

class Vehicle {
    public function startEngine(): void {
        echo "Engine started.\n";
    }
}

class Car extends Vehicle {
    public function drive(): void {
        echo "Car is moving.\n";
    }
}

$car = new Car();
$car->startEngine();
$car->drive();

Car 类继承 Vehicle,继承其方法。我们创建一个 Car 实例并调用继承的和新的方法。这展示了子类如何获得父类的功能。

重写方法

此示例展示了子类如何重写父类方法。

method_override.php
<?php

declare(strict_types=1);

class Animal {
    public function makeSound(): void {
        echo "Some generic animal sound.\n";
    }
}

class Dog extends Animal {
    public function makeSound(): void {
        echo "Bark! Bark!\n";
    }
}

$dog = new Dog();
$dog->makeSound();

Dog 类重写了 AnimalmakeSound 方法。当在 Dog 实例上调用时,子类版本将执行。这演示了多态性。

访问父类方法

此示例展示了如何从重写的子类方法中调用父类方法。

parent_method.php
<?php

declare(strict_types=1);

class Person {
    public function greet(): void {
        echo "Hello!\n";
    }
}

class Student extends Person {
    public function greet(): void {
        parent::greet();
        echo "I'm a student.\n";
    }
}

$student = new Student();
$student->greet();

Student 类继承 Person 并重写 greet。使用 parent::greet 调用原始父类方法。这允许扩展而不是替换父类功能。

受保护的成员

此示例演示了将受保护的属性与继承一起使用。

protected_members.php
<?php

declare(strict_types=1);

class BankAccount {
    protected float $balance = 0;

    public function getBalance(): float {
        return $this->balance;
    }
}

class SavingsAccount extends BankAccount {
    public function deposit(float $amount): void {
        $this->balance += $amount;
    }
}

$account = new SavingsAccount();
$account->deposit(100.50);
echo "Balance: " . $account->getBalance();

balance 属性是受保护的,因此 SavingsAccount 可以直接访问它。受保护的成员对子类可见,但对公众不可见。这保持了封装性,同时允许继承。

构造函数继承

此示例展示了构造函数如何与继承一起工作。

constructor_inheritance.php
<?php

declare(strict_types=1);

class Product {
    public function __construct(
        protected string $name,
        protected float $price
    ) {}
}

class Book extends Product {
    public function __construct(
        string $name,
        float $price,
        private string $author
    ) {
        parent::__construct($name, $price);
    }
}

$book = new Book("PHP Guide", 29.99, "John Doe");

Book 类继承 Product 并添加了作者属性。它调用父构造函数以设置继承的属性。子类必须处理父构造函数的要求。

最终类和方法

此示例演示了使用 final 关键字阻止继承。

final_keyword.php
<?php

declare(strict_types=1);

final class MathUtils {
    public static function square(float $num): float {
        return $num * $num;
    }
}

// This would cause an error:
// class AdvancedMath extends MathUtils {}

echo MathUtils::square(5);

final 关键字阻止 MathUtils 被扩展。最终方法不能在子类中被重写。这对于安全或实现永远不应该改变的情况很有用。

多层继承

此示例显示了三层继承层次结构。

multi_level.php
<?php

declare(strict_types=1);

class Shape {
    public function draw(): void {
        echo "Drawing a shape.\n";
    }
}

class Polygon extends Shape {
    public function draw(): void {
        echo "Drawing a polygon.\n";
    }
}

class Triangle extends Polygon {
    public function draw(): void {
        echo "Drawing a triangle.\n";
    }
}

$triangle = new Triangle();
$triangle->draw();

Triangle 继承 PolygonPolygon 继承 Shape。每一层都可以重写其父类的方法。对 draw() 的调用将执行层次结构中最具体的版本。

最佳实践

来源

PHP 继承文档

本教程使用 extends 关键字介绍了 PHP 继承,并提供了展示各种继承场景和最佳实践的实际示例。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 教程