06 php面向对象高级02

news/2024/11/30 10:45:31/文章来源:https://www.cnblogs.com/songxia/p/18578158

7. 继承

  • PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,格式如下:
class Child extends Parent {// 代码部分
}
  • 实例中 Child_Site 类继承了 Site 类,并扩展了功能
<?php 
// 子类扩展站点类别
class Child_Site extends Site {var $category;function setCate($par){$this->category = $par;}function getCate(){echo $this->category . PHP_EOL;}
}

8. 方法重写

  • 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 实例中重写了 getUrl 与 getTitle 方法
function getUrl() {echo $this->url . PHP_EOL;return $this->url;
}function getTitle(){echo $this->title . PHP_EOL;return $this->title;
}

10. 接口

  • 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
  • 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
  • 接口中定义的所有方法都必须是公有,这是接口的特性。
  • 要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
<?php// 声明一个'iTemplate'接口
interface iTemplate
{public function setVariable($name, $var);public function getHtml($template);
}// 实现接口
class Template implements iTemplate
{private $vars = array();public function setVariable($name, $var){$this->vars[$name] = $var;}public function getHtml($template){foreach($this->vars as $name => $value) {$template = str_replace('{' . $name . '}', $value, $template);}return $template;}
}

12. 抽象类

  • 任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
  • 定义为抽象的类不能被实例化。
  • 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
  • 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的
<?php
abstract class AbstractClass
{// 强制要求子类定义这些方法abstract protected function getValue();abstract protected function prefixValue($prefix);// 普通方法(非抽象方法)public function printOut() {print $this->getValue() . PHP_EOL;}
}class ConcreteClass1 extends AbstractClass
{protected function getValue() {return "ConcreteClass1";}public function prefixValue($prefix) {return "{$prefix}ConcreteClass1";}
}class ConcreteClass2 extends AbstractClass
{public function getValue() {return "ConcreteClass2";}public function prefixValue($prefix) {return "{$prefix}ConcreteClass2";}
}$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;
?>输出结果:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
  • 此外,子类方法可以包含父类抽象方法中不存在的可选参数。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则都是可以正常运行的
<?php
abstract class AbstractClass
{// 我们的抽象方法仅需要定义需要的参数abstract protected function prefixName($name);}class ConcreteClass extends AbstractClass
{// 我们的子类可以定义父类签名中不存在的可选参数public function prefixName($name, $separator = ".") {if ($name == "Pacman") {$prefix = "Mr";} elseif ($name == "Pacwoman") {$prefix = "Mrs";} else {$prefix = "";}return "{$prefix}{$separator} {$name}";}
}$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>输出结果:
Mr. Pacman
Mrs. Pacwoman

14. Final 关键字

  • PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。

15. 调用父类构造方法

  • PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct()
<?php
class BaseClass {function __construct() {print "BaseClass 类中构造方法" . PHP_EOL;}
}
class SubClass extends BaseClass {function __construct() {parent::__construct();  // 子类构造方法不能自动调用父类的构造方法print "SubClass 类中构造方法" . PHP_EOL;}
}
class OtherSubClass extends BaseClass {// 继承 BaseClass 的构造方法
}// 调用 BaseClass 构造方法
$obj = new BaseClass();// 调用 BaseClass、SubClass 构造方法
$obj = new SubClass();// 调用 BaseClass 构造方法
$obj = new OtherSubClass();
?>输出结果:
BaseClass 类中构造方法
BaseClass 类中构造方法
SubClass 类中构造方法
BaseClass 类中构造方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/844058.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Latex高亮文本,简单有效——overleaf也可以用

https://blog.csdn.net/ShuqiaoS/article/details/118217508 普通文本高亮 效果是这样的:首先在开头使用: \usepackage{soul, color, xcolor} 之后在需要高亮的地方使用: \hl{文本} (注意,如果应用了\hl但是没有反应或者高亮有问题,多半是由于没有包含color和xcolor的缘故…

【人人都能学得会的NLP - 文本分类篇 03】长文本多标签分类分类如何做?

【人人都能学得会的NLP - 文本分类篇 03】长文本多标签分类分类如何做? NLP Github【人人都能学得会的NLP - 文本分类篇 03】长文本多标签分类分类如何做?NLP Github 项目:NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、…

考研打卡(31)

开局(31) 开始时间 2024-11-30 08:23:52 结束时间 2024-11-30 09:24:35睡醒了。睡了六个小时睡不着了数据结构若一个有向图中的顶点不能排成一个拓扑序列,则可断定该有向图______(武汉科技大学 2013年) A 是个有根有向图 B 是个强连通图 C 含有多个入度为0的顶点 D 含有顶…

HTML5图像相关的标签有哪些?

HTML5 中与图像相关的标签主要有以下几个:<img> (Image): 这是最常用的图像标签,用于在网页上嵌入图像。它是一个自关闭标签,意味着它不需要结束标签 </img>。<picture> (Picture): <picture> 元素允许你定义多个图像源,浏览器会根据不同的设备特…

2024-2025-1 20241305 《计算机基础与程序设计》第十周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十周作业(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276))这个作业…

永硕网盘装修代码

查看代码<script> var num=2, rq_x=500, rq_d=800; var theme="3", linkstyle="0", colorbg="1"; var wfg="#FFF"; var music = [1433562661,1476239783,452804061,418602088,489768079,1478190629,1472951595,446944028,419374…

读数据质量管理:数据可靠性与数据质量问题解决之道19数据未来

数据未来1. 开创可靠数据系统的未来 1.1. 数据作为一个行业很可能正在经历一场巨大且不可逆转的巨变 1.2. 分析型数据正变成现代企业最关键和最具竞争力的核心资产1.2.1. 不再是公司是否依赖数据的问题1.2.2. 是使用多少数据以及将数据用于什么场景的问题1.3. 仅仅收集更多数据…

Linux之内存优化

虚拟内存与物理内存 计算机系统把内存组织成固定大小的页( page),页的大小是基于处理器架构的,例如在 x86_64 上标准的页为 4K。物理内存被划分为页帧(frames),一个页帧包含一页数据。 进程不会直接寻址物理内存,每个进程都有一个虚拟地址空间,当进程请求内存时,内核通过…

Linux之性能调优

什么是性能调优? 性能调优是调整系统设置以提高计算资源利用率,数据吞吐量和用户体验的过程。它需要非常了解系统的硬件和软件组件,以及系统之间的许多交互。性能调优有时也被称为“黑色艺术”。 性能调优经常与故障排查相混淆。但两者有很多区别。在做故障诊断时,主要目标…

企业级数据安全-CDH集群-dolphinscheduler海豚调度一站式数据安全技术实战2025

2024-11 月 测试环境 上 kerberos 认证1.1 修改 拷贝机器的IP地址, 改成和测试环境 5台机器一样的 IP映射,vim /etc/hosts 改成如下:127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain…

STMcubeMX 使用(一)

今天给大家介绍一个STMcubeMX的简单实用案例,让大家对这个工具的使用有一点直观的感受。 前提是你已经安装好了自己开发板需要使用的package。 第一步:打开我们已经安装好的STMcubeMX软件现在最新版本的STMcubeMX界面可以通过多个方式开始新建一个项目。 第二步,我们从MCU型…

OpenVZ 9.0 - 基于容器的 Linux 开源虚拟化解决方案

OpenVZ 9.0 - 基于容器的 Linux 开源虚拟化解决方案OpenVZ 9.0 - 基于容器的 Linux 开源虚拟化解决方案 Open source container-based virtualization for Linux 请访问原文链接:https://sysin.org/blog/openvz-9/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.or…