17611538698
webmaster@21cto.com

了解 PHP 中的继承

导读:PHP 支持单继承。它改进了你的代码结构,并且你可以使用它在类之间共享方法和属性。
继承使你能够使用其他类的代码。它有助于减少重复,并使你的代码更有条理。

当你创建一个具有通用属性和方法的父类时,子类会扩展它并访问其代码。子类还可以添加自己的功能或覆盖父类的方法。

以下是一个代码例子:

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关键字来调用父级版本。

感谢各位的阅读,欢迎点赞转发评价~

作者:万能的大雄

评论