- PHP 教程
- PHP - 首页
- PHP - 简介
- PHP - 安装
- PHP - 历史
- PHP - 特性
- PHP - 语法
- PHP - Hello World
- PHP - 注释
- PHP - 变量
- PHP - Echo/Print
- PHP - var_dump
- PHP - $ 和 $$ 变量
- PHP - 常量
- PHP - 魔术常量
- PHP - 数据类型
- PHP - 类型转换
- PHP - 类型混合
- PHP - 字符串
- PHP - 布尔值
- PHP - 整数
- PHP - 文件与 I/O
- PHP - 数学函数
- PHP - Heredoc 和 Nowdoc
- PHP - 复合类型
- PHP - 文件包含
- PHP - 日期和时间
- PHP - 标量类型声明
- PHP - 返回类型声明
- PHP 运算符
- PHP - 运算符
- PHP - 算术运算符
- PHP - 比较运算符
- PHP - 逻辑运算符
- PHP - 赋值运算符
- PHP - 字符串运算符
- PHP - 数组运算符
- PHP - 条件运算符
- PHP - 展开运算符
- PHP - 空值合并运算符
- PHP - 键值比较运算符
- PHP 控制语句
- PHP - 决策
- PHP - If…Else 语句
- PHP - Switch 语句
- PHP - 循环类型
- PHP - For 循环
- PHP - Foreach 循环
- PHP - While 循环
- PHP - Do…While 循环
- PHP - Break 语句
- PHP - Continue 语句
- PHP 函数
- PHP - 函数
- PHP - 函数参数
- PHP - 按值传递
- PHP - 按引用传递
- PHP - 默认参数
- PHP - 具名参数
- PHP - 可变参数
- PHP - 返回值
- PHP - 传递函数
- PHP - 递归函数
- PHP - 类型提示
- PHP - 变量作用域
- PHP - 严格类型
- PHP - 匿名函数
- PHP - 箭头函数
- PHP - 可变函数
- PHP - 局部变量
- PHP - 全局变量
- PHP 超全局变量
- PHP - 超全局变量
- PHP - $GLOBALS
- PHP - $_SERVER
- PHP - $_REQUEST
- PHP - $_POST
- PHP - $_GET
- PHP - $_FILES
- PHP - $_ENV
- PHP - $_COOKIE
- PHP - $_SESSION
- PHP 文件处理
- PHP - 文件处理
- PHP - 打开文件
- PHP - 读取文件
- PHP - 写入文件
- PHP - 文件是否存在
- PHP - 下载文件
- PHP - 复制文件
- PHP - 追加文件
- PHP - 删除文件
- PHP - 处理 CSV 文件
- PHP - 文件权限
- PHP - 创建目录
- PHP - 列出文件
- 面向对象 PHP
- PHP - 面向对象编程
- PHP - 类和对象
- PHP - 构造函数和析构函数
- PHP - 访问修饰符
- PHP - 继承
- PHP - 类常量
- PHP - 抽象类
- PHP - 接口
- PHP - 特性
- PHP - 静态方法
- PHP - 静态属性
- PHP - 命名空间
- PHP - 对象迭代
- PHP - 封装
- PHP - Final 关键字
- PHP - 重载
- PHP - 克隆对象
- PHP - 匿名类
- PHP Web 开发
- PHP - Web 概念
- PHP - 表单处理
- PHP - 表单验证
- PHP - 表单邮件/URL
- PHP - 完整表单
- PHP - 文件包含
- PHP - GET 和 POST
- PHP - 文件上传
- PHP - Cookies
- PHP - Sessions
- PHP - Session 选项
- PHP - 发送邮件
- PHP - 过滤输入
- PHP - Post-Redirect-Get (PRG)
- PHP - 闪存消息
- PHP 高级
- PHP - MySQL
- PHP.INI 文件配置
- PHP - 数组解构
- PHP - 编码规范
- PHP - 正则表达式
- PHP - 错误处理
- PHP - Try…Catch
- PHP - Bug 调试
- PHP - 适用于 C 开发人员
- PHP - 适用于 PERL 开发人员
- PHP - 框架
- PHP - Core PHP 与框架
- PHP - 设计模式
- PHP - 过滤器
- PHP - JSON
- PHP - 异常
- PHP - 特殊类型
- PHP - 哈希
- PHP - 加密
- PHP - is_null() 函数
- PHP - 系统调用
- PHP - HTTP 认证
- PHP - 交换变量
- PHP - Closure::call()
- PHP - 过滤的 unserialize()
- PHP - IntlChar
- PHP - CSPRNG
- PHP - 预期
- PHP - Use 语句
- PHP - 整数除法
- PHP - 已弃用的功能
- PHP - 已移除的扩展和 SAPI
- PHP - PEAR
- PHP - CSRF
- PHP - FastCGI 进程
- PHP - PDO 扩展
- PHP - 内置函数
- PHP 有用资源
- PHP - 速查表
- PHP - 问答
- PHP - 快速指南
- PHP - 在线编译器
- PHP - 有用资源
- PHP - 讨论
PHP – 继承
继承是面向对象编程方法的基本原则之一。继承是一种软件建模方法,它能够扩展现有类的功能来构建新类,而不是从头开始构建。
PHP 提供了在其对象模型中实现继承的所有功能。在 PHP 软件开发中使用继承可以实现代码重用,消除冗余的代码重复,并进行逻辑组织。
假设您需要设计一个新类,其大部分功能已经在现有类中定义好了。继承允许您扩展现有类,添加或删除其功能,并开发一个新类。事实上,PHP 具有“extends”关键字来建立现有类和新类之间的继承关系。
class newclass extends oldclass { ... ... }
当一个新类(以下称为继承类、子类、子类等)与现有类(称为基类、超类、父类等)存在“IS A”关系时,就会出现继承。
在 PHP 中,当通过扩展另一个类来定义一个新类时,子类会继承父类的公共和受保护的方法、属性和常量。您可以自由地覆盖继承方法的功能,否则它将保留在父类中定义的功能。
示例
请看下面的示例:
<?php class myclass { public function hello() { echo "Hello from the parent class" . PHP_EOL; } public function thanks() { echo "Thank you from parent class" . PHP_EOL; } } class newclass extends myclass { public function thanks() { echo "Thank you from the child class" . PHP_EOL; } } # object of parent class $obj1 = new myclass; $obj1->hello(); $obj1->thanks(); # object of child class $obj2 = new newclass; $obj2->hello(); $obj2->thanks(); ?>
它将产生以下输出:
Hello from the parent class Thank you from parent class Hello from the parent class Thank you from the child class
如前所述,子类继承了父类的公共和受保护的成员(属性和方法)。子类可以引入额外的属性或方法。
在下面的示例中,我们使用Book 类作为父类。在这里,我们创建一个ebook 类,它扩展了 Book 类。新类有一个额外的属性 - format(表示电子书的文件格式 - EPUB、PDF、MOBI 等)。ebook 类定义了两个新方法来初始化和输出电子书数据 - getebook() 和 dispebook()。
示例
继承示例的完整代码如下:
<?php class Book { /* Member variables */ protected int $price; protected string $title; public function getbook(string $param1, int $param2) { $this->title = $param1; $this->price = $param2; } public function dispbook() { echo "Title: $this->title Price: $this->price \n"; } } class ebook extends Book { private string $format; public function getebook(string $param1, int $param2, string $param3) { $this->title = $param1; $this->price = $param2; $this->format = $param3; } public function dispebook() { echo "Title: $this->title Price: $this->price\n"; echo "Format: $this->format \n"; } } $eb = new ebook; $eb->getebook("PHP Fundamentals", 450, "EPUB"); $eb->dispebook(); ?>
浏览器输出如下所示:
Title: PHP Fundamentals Price: 450 Format: EPUB
如果您仔细查看 getebook() 函数,前两个赋值语句实际上是 getbook() 函数,该函数是由 ebook 类继承的。因此,我们可以使用 parent 关键字和作用域解析运算符来调用它。
将 getebook() 函数代码更改为以下内容:
public function getebook(string $param1, int $param2, string $param3) { parent::getbook($param1, $param2); $this->format = $param3; }
类似地,dispebook() 函数中的第一个 echo 语句被替换为对父类中 dispbook() 函数的调用:
public function dispebook() { parent::dispbook(); echo "Format: $this->format<br/>"; }
继承中的构造函数
父类中的构造函数会被子类继承,但是如果子类定义了自己的构造函数,则不能直接在子类中调用父类的构造函数。
为了运行父构造函数,需要在子构造函数中调用parent::__construct()。
示例
请看下面的示例:
<?php class myclass{ public function __construct(){ echo "This is parent constructor". PHP_EOL; } } class newclass extends myclass { public function __construct(){ parent::__construct(); echo "This is child class destructor" . PHP_EOL; } } $obj = new newclass(); ?>
它将产生以下输出:
This is parent constructor This is child class destructor
但是,如果子类没有构造函数,则它可以像普通类方法一样从父类继承(如果它没有声明为私有)。
示例
请看下面的示例:
<?php class myclass{ public function __construct(){ echo "This is parent constructor". PHP_EOL; } } class newclass extends myclass{ } $obj = new newclass(); ?>
它将产生以下输出:
This is parent constructor
PHP 不允许通过扩展多个父类来开发类。您可以进行层次继承,其中类 B 扩展类 A,类 C 扩展类 B,依此类推。但是 PHP 不支持多重继承,其中类 C 试图同时扩展类 A 和类 B。但是,我们可以扩展一个类并实现一个或多个接口。我们将在后续章节中学习有关接口的知识。