slot deposit pulsa slot mahjong slot gacor slot gacor slot gacor resmi slot gacor 2025 slot gacor terpercaya slot gacor 2025 slot gacor hari ini slot gacor hari ini slot gacor hari ini
了解 PHP 中的继承
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关键字来调用父级版本。

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

作者:万能的大雄

评论