PHP OOP - 继承
PHP - 什么是继承?
OOP 中的继承 = 当一个类派生自另一个类。
子类将继承父类中的所有公共和受保护的属性和方法。此外,它可以有自己的属性和方法。
继承类是使用 extends
关键字定义的。
让我们看一个例子
示例
<?php
class Fruit {
public $name;
public $color;
public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "The fruit is {$this->name} and the color is {$this->color}.";
}
}
// Strawberry 从 Fruit 继承
class Strawberry extends Fruit {
public function message() {
echo "Am I a fruit or a berry? ";
}
}
$strawberry = new Strawberry("Strawberry", "red");
$strawberry->message();
$strawberry->intro();
?>
尝试一下 »
示例说明
Strawberry 类继承自 Fruit 类。
这意味着 Strawberry 类可以使用 Fruit 类中的公共 $name 和 $color 属性以及公共 __construct() 和 intro() 方法,因为继承。
Strawberry 类也有自己的方法:message()。
PHP - 继承和受保护的访问修饰符
在上一章中,我们了解到 protected
属性或方法可以在类内部和从该类派生的类中访问。这是什么意思?
让我们看一个例子
示例
<?php
class Fruit {
public $name;
public $color;
public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
protected function intro() {
echo "The fruit is {$this->name} and the color is {$this->color}.";
}
}
class Strawberry extends Fruit {
public function message() {
echo "Am I a fruit or a berry? ";
}
}
// 尝试从类外部调用所有三个方法
$strawberry = new Strawberry("Strawberry", "red"); // 正常。__construct() 是公共的
$strawberry->message(); // 正常。message() 是公共的
$strawberry->intro(); // 错误。intro() 是受保护的
?>
尝试一下 »
在上面的示例中,我们看到如果我们尝试从类外部调用 protected
方法 (intro()),我们将收到错误。 public
方法将正常工作!
让我们看另一个例子
示例
<?php
class Fruit {
public $name;
public $color;
public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
protected function intro() {
echo "The fruit is {$this->name} and the color is {$this->color}.";
}
}
class Strawberry extends Fruit {
public function message() {
echo "Am I a fruit or a berry? ";
// 从派生类内部调用受保护的方法 - 正常
$this -> intro();
}
}
$strawberry = new Strawberry("Strawberry", "red"); // 正常。__construct() 是公共的
$strawberry->message(); // 正常,因为 message() 是公共方法,它在派生类中调用了 intro()(它是受保护的)。
?>
尝试一下 »
在上面的示例中,我们看到一切正常!这是因为我们在派生类内部调用了 protected
方法(intro())。
PHP - 重写继承的方法
继承的方法可以通过在子类中重新定义方法(使用相同名称)来重写。
看看下面的例子。子类(Strawberry)中的 __construct() 和 intro() 方法将重写父类(Fruit)中的 __construct() 和 intro() 方法。
示例
<?php
class Fruit {
public $name;
public $color;
public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "The fruit is {$this->name} and the color is {$this->color}.";
}
}
class Strawberry extends Fruit {
public $weight;
public function __construct($name, $color, $weight) {
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
public function intro() {
echo "水果是 {$this->name},颜色是 {$this->color},重量是 {$this->weight} 克。";
}
}
$strawberry = new Strawberry("草莓", "红色", 50);
$strawberry->intro();
?>
尝试一下 »
PHP - final 关键字
final
关键字可以用来阻止类继承或阻止方法重写。
以下示例演示了如何阻止类继承
以下示例演示了如何阻止方法重写
示例
<?php
class Fruit {
final public function intro() {
// 一些代码
}
}
class Strawberry extends Fruit {
// 将导致错误
public function intro() {
// 一些代码
}
}
?>
尝试一下 »