php protected 重写
在 PHP 中,有许多访问控制修饰符可以用来限制对类成员的访问。在本文中,我将重点介绍其中之一,即 protected。protected 修饰的成员可以被其所属类及其子类访问。本文将讨论如何通过重写 protected 成员来实现对父类成员的扩展。
一个类的实例可以访问其自身和其祖先类中的 public 成员,但不能访问其祖先类中声明为 protected 或 private 的成员。比方说,假设我们有一个父类 Car,它有一个 protected 属性 $gas。如果我们定义了一个子类 SportsCar,我们可以通过从 SportsCar 中试图访问 $gas 来了解访问权限的影响。我们可以在 SportsCar 中定义一个方法来获取 $gas 属性的值:
class Car{protected $gas = 'unleaded';}class SportsCar extends Car{public function getGas(){return $this->gas;}}$sportsCar = new SportsCar();echo $sportsCar->getGas(); // 报错:Fatal error: Uncaught Error: Cannot access protected property SportsCar::$gas
代码执行将导致致命错误。这是因为通过 $this->gas,我们试图访问父类 Car 中声明为 protected 的成员 $gas。为了覆盖一个父类的 protected 属性,我们可以在子类中定义同名的 protected 属性。如下所示:
class SportsCar extends Car{protected $gas;public function __construct(){$this->gas = 'premium';}public function getGas(){return $this->gas;}}$sportsCar = new SportsCar();echo $sportsCar->getGas(); // 输出 premium
现在,我们覆盖了父类 Car 中的 protected $gas 属性。必须注意的是,我们没有使用任何关键字来声明子类属性 $gas 的访问控制,因为这个属性是应该保护的。另外需要注意的是,父类的方法可以访问子类中的 protected 的属性。因此,如果我们在父类中定义一个方法,它试图访问子类覆盖的属性,不会出现上述的访问限制。如下所示:
class Car{protected $gas = 'unleaded';public function setGas($gas){$this->gas = $gas;}public function getGas(){return $this->gas;}}class SportsCar extends Car{protected $gas;public function __construct(){$this->gas = 'premium';}public function setGas($gas){parent::setGas($gas);$this->gas = $this->getGas();}public function getGas(){return $this->gas;}}$sportsCar = new SportsCar();echo $sportsCar->getGas(); // 输出 premium <br>$sportsCar->setGas('diesel');echo $sportsCar->getGas(); // 输出 diesel
在这个示例中,我们在父类 Car 中定义了 setGas() 方法,在子类 SportsCar 中对其进行了重写,以使用子类中的属性 $gas 覆盖父类中的属性 $gas。此外,在子类中的 getGas() 方法也被重写,它返回子类属性 $gas 的值。我们注意到,当我们调用子类 SportsCar 的 setGas() 方法时,它首先在父类 Car 中执行,然后在子类 SportsCar 中访问子类的属性 $gas。接下来,在调用子类 SportsCar 的 getGas() 方法时,它返回子类的属性 $gas 值,而不是父类的属性 $gas 值。上一篇:php programming
webacc.exe是什么文件?webacc.exe是不是病毒
WINSYS.vbs是什么文件?WINSYS.vbs是不是病毒
winssh.exe是什么文件?winssh.exe是不是病毒
wt.exe是什么文件?wt.exe是不是病毒
winsysetm.exe是什么文件?winsysetm.exe是不是病毒
winstrve.exe是什么文件?winstrve.exe是不是病毒
winsysupd7.exe是什么文件?winsysupd7.exe是不是病毒
winsysupd.exe是什么文件?winsysupd.exe是不是病毒
winsysupd2.exe是什么文件?winsysupd2.exe是不是病毒
winsysupd8.exe是什么文件?winsysupd8.exe是不是病毒