PHP extends继承的具体实现(附带实例)
在实际开发中,为了防止相同功能的重复定义,PHP 提供了继承功能。
在生活中,继承一般是指子女继承父辈的财产。在 PHP 中,类的继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类或派生类,现有类被称作父类或基类。
子类自动拥有父类所有可继承的属性和方法,当子类和父类有同名的类成员时,子类的成员会覆盖父类的成员。
使用 extends 关键字实现子类与父类之间的继承,其基本语法格式如下:
为了让读者更好地理解继承,下面演示继承的实现,具体代码如下:
PHP 中的访问控制修饰符如下表所示:
为了帮助读者更好地理解有限继承,下面通过代码演示,具体步骤如下:
1) 定义 People 类,具体代码如下:
2) 定义 Man 类继承 People 类,具体代码如下:
3) 实例化 Man 类,查看输出结果,具体代码如下:
上述第 2 行代码执行后的输出结果如下:
通过 Man 类对象调用公有方法 showName()、getProtected() 和 getPrivate(),具体代码如下:
上述第 3 行代码执行后程序会报错,错误信息如下:
在生活中,继承一般是指子女继承父辈的财产。在 PHP 中,类的继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类或派生类,现有类被称作父类或基类。
子类自动拥有父类所有可继承的属性和方法,当子类和父类有同名的类成员时,子类的成员会覆盖父类的成员。
使用 extends 关键字实现子类与父类之间的继承,其基本语法格式如下:
class 子类名 extends 父类名 { }需要注意的是,PHP 只允许单继承,即每个子类只能继承一个父类,不能同时继承多个父类。
为了让读者更好地理解继承,下面演示继承的实现,具体代码如下:
// 定义父类People类 class People { public $name; public function say() { echo $this->name . ' is speaking'; } } // 定义子类Man类,继承People类 class Man extends People { public function __construct($name) { $this->name = $name; } } $man = new Man('Tom'); echo $man->name; // 输出结果:Tom $man->say(); // 输出结果:Tom is speaking在上述代码中,第 11 行代码的 Man 类通过 extends 关键字继承 People 类,继承后,Man 类是 People 类的子类;第 19 行代码用于输出从父类继承的 $name 的值;第 20 行代码用于调用从父类继承的 say() 方法。
PHP访问控制修饰符
子类继承父类时,受访问控制修饰符的限制,不能继承父类所有的内容,而是继承父类的部分内容。PHP 中的访问控制修饰符如下表所示:
访问控制修饰符 | 属性 | 方法 |
---|---|---|
public | 可以继承 | 可以继承 |
protected | 可以继承 | 可以继承 |
private | 可以继承 | 不能继承 |
为了帮助读者更好地理解有限继承,下面通过代码演示,具体步骤如下:
1) 定义 People 类,具体代码如下:
class People { public $name = 'Tom'; // 公有属性 protected $age = '20'; // 受保护属性 private $money = '5000'; // 私有属性 public function showName() // 公有方法 { echo $this->name; } protected function showAge() // 受保护方法 { echo $this->age; } private function showMoney() // 私有方法 { echo $this->money; } }在上述代码中,People 类中定义了公有属性 $name 和公有方法 showName()、受保护属性 $age 和受保护方法 showAge()、私有属性 $money 和私有方法 showMoney()。
2) 定义 Man 类继承 People 类,具体代码如下:
class Man extends People { public function getProtected() { echo $this->showAge(); } public function getPrivate() { echo $this->money; $this->showMoney(); } }在上述代码中,定义了 Man 类继承 People 类,受保护的属性和方法允许在子类内部访问,不允许在类外访问。在 Man 类中定义 getProtected() 方法访问父类受保护的方法 showAge();定义 getPrivate() 方法访问父类私有属性 $money 和私有方法 showMoney()。
3) 实例化 Man 类,查看输出结果,具体代码如下:
$man = new Man(); var_dump($man);
上述第 2 行代码执行后的输出结果如下:
object(Man)#1(3) { ["name"]=>string(3)"Tom" ["age":protected]=>string(2)"20" ["money":"People":private]=>string(4)"5000" }从上述输出结果可以看出,Man 类继承了 People 类的公有属性 $name、受保护属性 $age 和私有属性 $money。
通过 Man 类对象调用公有方法 showName()、getProtected() 和 getPrivate(),具体代码如下:
$man->showName(); // 输出结果:Tom $man->getProtected(); // 输出结果:20 $man->getPrivate(); // 报错
上述第 3 行代码执行后程序会报错,错误信息如下:
Warning:Undefined property:Man::$money in… Fault error:Uncaught Error:Call to private method People::showMoney() from scope Man in…从报错的信息可以看出,私有属性可以被继承,但是无法在子类内部访问,私有方法不能被继承。