继承使你能够使用其他类的代码。它有助于减少重复,并使你的代码更有条理。
当你创建一个具有通用属性和方法的父类时,子类会扩展它并访问其代码。子类还可以添加自己的功能或覆盖父类的方法。
以下是一个代码例子:
class Gibson {
public function run() {
echo "Running device";
}
}
class AirCondition extends Gibson {
public function run() {
echo "Cooling room";
}
}
$ac = new AirCondition();
$ac->run();
输出结果为:
Cooling room
该类AirCondition扩展了Gibson。它run用自己的版本覆盖了 的方法。
在下一部分中,您将了解有关PHP 中继承类型的更多信息。让我们继续。
PHP 中的继承类型
我们有三种类型,如下:
单继承:一个子类从一个父类继承。
多级继承:一个类从已经从另一个类继承的类继承。
层次继承:多个子类从同一个父类继承。
以下是一个代码例子:
class Device {
public function start() {
echo "Device started";
}
}
class Gibson extends Device {
public function run() {
echo "Running device";
}
}
class AirCondition extends Gibson {
public function cool() {
echo "Cooling room";
}
}
这里我们有三个具有继承的类:Device、Gibson和AirCondition。Device有一个start()输出“设备已启动”的方法。Gibson扩展Device并添加一个run()方法,因此的对象Gibson可以同时使用start()和run()。AirCondition扩展Gibson,继承start()和run(),并添加一个cool()方法。
这将创建一个类多级继承,其中AirCondition可以访问所有三种方法:start()、run()和cool()。
这是层次继承的另一个示例:
class Gibson {
public function run() {
echo "Running device";
}
}
class AirCondition extends Gibson {
public function cool() {
echo "Cooling room";
}
}
class Heater extends Gibson {
public function heat() {
echo "Warming room";
}
}
该类Gibson有一个run()方法。AirCondition和Heaterextends 都Gibson继承了它的run()方法。addsAirCondition是一个cool()方法,而Heaterextends 是一个heat()方法。这展示了子类如何从父类继承和扩展功能。
使用 PHP 继承的原因
那么,为什么要在 PHP 中使用继承呢?
继承允许子类重用父类的代码。这减少了冗余,使维护更容易。
它可以帮助您组织代码,在父类中对相似的功能进行分组,并在子类中扩展它。
子类可以覆盖或扩展父类的方法,从而无需更改基本功能即可提供定制。
如果某个公共功能需要更新,您可以在父类中更改它,并且所有子类都会自动继承该更新。
现在,让我们了解如何覆盖方法以及类和对象如何使用它们。
PHP 中的覆盖方法
当子类为父类中已存在的方法提供新的实现时,就会发生方法重写。子类方法必须具有相同的名称和参数,并且还应具有相同的可见性。
让我们举个例子:
class Device {
public function start() {
echo "Device started";
}
}
class AirCondition extends Device {
public function start() {
echo "AirCondition started";
}
}
$device = new AirCondition();
$device->start();
输出结果为:
AirCondition started
在 PHP 中使用 parent 关键字
该parent关键字允许你从父类调用方法或访问属性。当你重写子类中的方法但仍需要从父类调用原始方法时,它非常有用。
class Device {
public function start() {
echo "Device started";
}
}
class AirCondition extends Device {
public function start() {
echo "AirCondition started. ";
parent::start(); // Call the parent class method
}
}
$device = new AirCondition();
$device->start();
输出结果:
AirCondition started. Device started.
构造函数默认不会被继承。如果子类没有定义自己的构造函数,则会继承父类的构造函数。
但是,如果子类定义了构造函数,则子类将覆盖父类的构造函数。
使用parent::__construct()方法从子类调用父类的构造函数:
class Device {
public function __construct() {
echo "Device constructor called\n";
}
}
class AirCondition extends Device {
public function __construct() {
parent::__construct(); // Call parent constructor
echo "AirCondition constructor called\n";
}
}
$device = new AirCondition();
输出结果:
Device constructor called
AirCondition constructor called
它的工作原理如下:
AirCondition覆盖父构造函数,但它仍然Device使用调用的构造函数parent::__construct()。
这确保在创建AirCondition对象时两个构造函数都被执行。
PHP 中的单级继承与多级继承
单继承是指一个类从一个父类继承。多级继承是指一个类从一个子类继承,而该子类又已经从另一个类继承。
单一继承示例
class Country {
public function capital() {
echo "The capital city of this country.";
}
}
class China extends Country {
public function language() {
echo "The language spoken is Chinese.";
}
}
China从Country继承了capital()方法。
class Country {
public function capital() {
echo "The capital city of this country.";
}
}
class Asia extends Country {
public function continent() {
echo "This country is in Asia.";
}
}
class China extends Asia {
public function language() {
echo "The language spoken is Japanese.";
}
}
类China继承自Asia,而 又继承自Country。因此,China可以访问方法capital()、continent()和language()。
PHP 中的继承与接口
PHP 中的继承允许一个类从一个父类中获取代码。子类从父类中获取方法和属性,并可以对其进行修改。PHP 只允许一个父类。
接口(Interface)定义了类必须遵循的规则。它们不包含代码,只包含方法名称。类必须为每个方法编写自己的代码。PHP 允许一个类使用多个接口。
以下是一个代码例子:
interface Speak {
public function speak();
}
class Japan implements Speak {
public function speak() {
echo "Japan speaks Japanese.";
}
}
继承共享实际代码。
PHP 接口强制类遵循某种结构。
PHP 中的继承和访问修饰符
PHP 中的访问修饰符控制方法和属性的可见性。它们影响继承的运作方式,从而限制或允许对类的某些部分的访问。三个主要的访问修饰符是:
“public” 关键字决定方法和属性可以从任何地方访问。包括子类。
“protected”关键字表明方法和属性可以在类及其子类内部访问,但不能从外部访问。
“私有”是指方法和属性只能在定义它们的类内访问,而不能在子类或外部访问。
以下是一个代码例子:
class Device {
public $name;
protected $brand;
private $serialNumber;
public function __construct($name, $brand, $serialNumber) {
$this->name = $name;
$this->brand = $brand;
$this->serialNumber = $serialNumber;
}
public function getName() {
return $this->name;
}
protected function getBrand() {
return $this->brand;
}
private function getSerialNumber() {
return $this->serialNumber;
}
}
class AirCondition extends Device {
public function displayInfo() {
//=> public method
echo $this->getName();
//=> protected method can be accessed by subclass
echo $this->getBrand();
//=> This shows error: private method can't be accessed in subclass
// echo $this->getSerialNumber();
}
}
$ac = new AirCondition("Cooler", "Samsung", "12345");
$ac->displayInfo();
公共属性或方法(如name和getName())可以在任何地方访问。
受保护的属性或方法(如brand和getBrand())可以在类和子类内部访问,但不能在外部访问。
私有属性或方法(如serialNumber和getSerialNumber())只能在定义它们的类内部访问。
结论
继承允许你重用代码。你可以在父类中编写共享的功能,然后子类可以使用它们。这样就不需要你重复编写代码了。
子类还可以添加新方法或替换父类中的方法。这赋予了您控制权。我们了解了单级继承、多级继承和层级继承的工作原理。每种类型都展示了一个类如何基于另一个类构建。
我们还学习了如何覆盖方法。如果父级和子级都存在某个方法,PHP 会运行子类版本。但你仍然可以使用parent关键字来调用父级版本。
感谢各位的阅读,欢迎点赞转发评价~
作者:万能的大雄