首页 > 编程笔记 > PHP笔记 阅读:1

PHP extends继承的具体实现(附带实例)

在实际开发中,为了防止相同功能的重复定义,PHP 提供了继承功能。

在生活中,继承一般是指子女继承父辈的财产。在 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…
从报错的信息可以看出,私有属性可以被继承,但是无法在子类内部访问,私有方法不能被继承。

相关文章