PHP面向对象02:面向对象高级

news2024/12/28 20:19:52

PHP面向对象02:面向对象高级

  • 一、设计模式
    • 1. 单例模式
    • 2. 工厂模式
  • 二、面向对象三大特性
    • 1. 封装
    • 2. 继承
    • 3. 多态
  • 三、继承
    • 1. 实现继承
    • 2. 有限继承
      • a. 属性都能继承
      • b. 公有方法
      • c. 受保护的方法
      • d. 静态成员
    • 3. 重写
    • 4. PHP继承特点
    • 5. 静态延迟绑定
    • 6. 最终类和最终方法
    • 7. 抽象类和抽象方法
  • 四、接口
  • 五、代码复用
    • 1. trait 基本使用
    • 2. 同时使用多个 trait
    • 3. trait 其他用法
  • 六、PHP重载
    • 1. 属性重载
    • 2. 方法重载
  • 七、对象遍历

一、设计模式

1. 单例模式

  • 单例模式:一个类最多只有一个对象。
  • 单例模式的目的时为了保护资源的唯一性。
  • 设计规范:三私一公。
class Singleton{
    private static $obj = null;
    private function __construct() {
    }
    private function __clone() {
    }
    public static function getInstance() {
        if (!(self::$obj instanceof self)) {
            self::$obj = new self();
        }
        return self::$obj;
    }
}

2. 工厂模式

  • 工厂模式是一种按需生产对象的模式。
  • 优点:方便后期对类的维护。
  • 缺点:随着功能增加,需要开发多个工厂。
<?php
class Man{
    public function display() {
        echo "这是男人";
    }
}
class Woman{
    public function display() {
        echo "这是女人";
    }
}
// 工厂类
class HumanFactory{
    public static function getInstance($classname) {
        switch ($classname) {
            case 'w':
                return new Woman();
            case 'm':
                return new Man();
            default:
                return null;
        }
    }
}

$woman = HumanFactory::getInstance('w');
$man = HumanFactory::getInstance('m');
$woman->display();  // 这是女人
$man->display();  // 这是男人

二、面向对象三大特性

1. 封装

  • 封装是指将数据和对数据的操作捆绑在一起,形成对外界隐蔽,同时对外提供可以操作的接口(通常是方法)。
  • 封装是从对象抽象成类的过程。

2. 继承

  • 继承的基础:子类与父类之间本身是一种包含的关系。
  • 继承关键字:extends
  • 继承效果:子类可以直接访问父类中已经存在的公共public成员。

3. 多态

  • 在继承的前提下,同时出现方法的重写。父类指向子类的属性。
  • PHP中不支持多态。

三、继承

1. 实现继承

  • 继承关系利用extends关键字实现。
  • 实现继承关系后,子类对象可以访问父类被继承的成员。而父类对象不可以访问子类成员。
<?php
class Human {
    public function eat() {
        echo "eat";
    }
}

class Man extends Human {
}

$man = new Man();
$man->eat();

2. 有限继承

  • 继承内容:公有成员、受保护成员、私有属性(所有属性和除私有方法以外的方法)。
  • 不能继承:私有方法。
  • protected 只能在子类内部访问,不能再外部访问。

a. 属性都能继承

在这里插入图片描述

b. 公有方法

在这里插入图片描述

c. 受保护的方法

外部访问不了,只能在类内部访问

在这里插入图片描述

d. 静态成员

在这里插入图片描述

3. 重写

  • 子类可以重写父类的任意类成员,用于扩展或更改某些业务逻辑。
  • 重写的要求:
    1. 重写的子类成员权限范围必须比父类更开放。
    2. 子类方法必须与父类重写方法参数一致。
    3. 父类私有方法不会被继承,所以不会被重写。
<?php
class Human{
    public $name = "Human";
    public function show(){
        echo __CLASS__;
    }
}

class Man extends Human {
    public $name = "Man";
    public function show() {
        echo __CLASS__ . "HelloWorld";
    }
}

$man = new Man();
echo $man->name;  // Man
$man->show();  // ManHelloWorld
  • 如果想用父类的被重写的方法,需要在子类中使用 parent 关键字
  • parent 只能访问方法和静态属性,不能访问成员属性(被重写的属性直接没了)。
class Human{
    public function show(){
        echo __CLASS__;
    }
}

class Man extends Human {
    public function show() {
        parent::show();
        echo __CLASS__ . "HelloWorld";
    }
}

4. PHP继承特点

  1. PHP只能单继承。如果想要继承多个类,使用链式继承。
  2. 继承只有私有方法不能被继承。
  3. 允许子类继承父类的构造方法和析构方法。

5. 静态延迟绑定

  • self是一种静态绑定,不管是子类还是父类,self写在哪个类里就代表哪个类。
  • 静态延迟绑定使用关键字 static,即当方法被访问时,哪个类访问就绑定那个类。
  • 静态延迟绑定需要使用到静态成员的重写。
<?php
class Human{
    public static $name = 'Human';

    public static function getName() {
    	// 静态绑定
        echo self::$name."<br>";   // Man访问,依旧输出Human的name
        // 静态延迟绑定
        echo static::$name . "<br>";  // Man访问,输出Man里面的name
    }
}
class Man extends Human{
	// 重写静态成员
    public static $name = 'Man';
}

Man::getName();

6. 最终类和最终方法

  • 都使用final关键字修饰。
  • 最终类,表示此类不可以被继承。
  • 最终方法,表示该方法不可以被重写。
<?php
class Man{
    // 最终方法
    final public function getName(){
        echo __CLASS__;
    }
}
// 最终类
final class Boy extends Man{}

7. 抽象类和抽象方法

  • 都使用abstract关键字修饰。
  • 抽象类,表示不能被实例化,只能被继承。目的是规范某些类必须有某些方法。
  • 抽象方法,表示该方法不能有方法体,而且抽象方法的类必须声明为抽象类。
  • 抽象方法本身就是需要被重写的,所以不能私有。
<?php
// 抽象类
abstract class Human{
    // 抽象方法
    abstract public function eat();
    // 普通方法
    public function drink(){
        echo "喝水";
    }
}

// 抽象类只能被继承
class Man extends Human{
    // 实现抽象方法
    public function eat() {}
}

四、接口

  • 接口,使用 interface 关键字定义,用来规范一些共性类必须实现的方法。
  • 接口不是类,不可以被实例化,只能被类实现。
  • 接口中只能定义公有抽象方法(在接口中的方法默认是抽象方法)和接口常量。
  • 类实现接口时,必须实现接口中所有的抽象方法。
<?php
interface Human {
    // 接口中只能存在接口常量和抽象方法
    const NAME = "人";
    // 默认是抽象方法
    public function eat();
}

// 实现接口
class Man implements Human{
    // 实现方法
    public function eat() {}
}
  • 接口可以继承继承,支持多继承。
interface Human {}
interface Animal{}
interface Dog extends Animal{}
interface Ape extends Human,Animal{}
  • 抽象类可以实现接口,普通类继承抽象类。
# 定义接口
interface Human {
    const NAME = "人";
    public function eat();
}
# 抽象类实现接口
abstract class Woman implements Human {
    abstract public function drink();
}
# 普通类继承抽象类,必须实现所有抽象方法。
class Girl extends Woman {
    public function eat() {
        echo "吃饭";
    }
    public function drink() {
        echo "喝水";
    }
}

五、代码复用

1. trait 基本使用

  • trait 是为PHP准备的一种代码复用机制,类似于class
  • trait 内部可以拥有成员属性、成员方法、静态成员,但不能有常量。
  • trait 不是类,不能被实例化。
  • trait 是用来将公共代码提供给其他类使用的,类使用trait 的前提是加载对应的trait
<?php
trait Eat{
    public $time = 100;
    public function showtime(){
        echo $this->time;
    }
}
class Man{
    // 引入trait公共代码
    use Eat;
}
// 可以直接使用
$man = new Man();
$man->showtime();

2. 同时使用多个 trait

  • 一个类可以使用多个 trait
<?php
trait Eat{
    ...
}
trait Sleep{
    ...
}
class Man{
    use Eat, Sleep;
}
  • 多个 trait 有同名方法,处理冲突的方法是 insteadof 代理处理和对被替换方法使用别名。
<?php
trait Eat{
    public function show(){
        echo "吃饭";
    }
}
trait Sleep{
    public function show(){
        echo "睡觉";
    }
}
class Man{
    use Eat, Sleep{
        // 明确使用Eat里面的show方法
        Eat::show insteadof Sleep;
        // Sleep的show方法改名为shows
        Sleep::show as shows;
    }
}

$man = new Man();
$man->show();
$man->shows();
  • 类中不允许定义与 trait 中同名的属性,但方法可以(类方法覆盖trait方法)。
  • 如果 trait 与父类中有同名方法, trait 方法将覆盖父类同名方法。如果要访问父类方法,可以使用 parent关键字。
  • 优先级:自己的方法 > trait 方法 > 父类方法。
<?php
trait Eat{
    public function show(){
        echo "吃饭";
    }
}
class Human{
    public function show(){
        echo "人";
    }
}
class Woman extends Human{
    use Eat;
}

$woman = new Woman();
$woman->show();  // 吃饭

3. trait 其他用法

  • trait 不能自己访问,只能用来给其他代码提供代码复用。
  • 允许类在使用 trait 时,使用更高的访问控制权。
trait Drink{
    private function show(){
        echo "喝水";
    }
}
class Girl{
    use Drink{
    	# 修改访问控制权
        show as public eshow;
    }
}

$girl = new Girl();
$girl->eshow();   // 喝水
  • trait 可以使用抽象方法,用来规范使用类必须实现对应抽象方法。使用类要么是抽象类,要么必须实现抽象方法。

六、PHP重载

  • 是指当某些不允许的操作发生时,会自动调用的一种内部机制,即自动调用相关的魔术方法。
  • 魔术方法:系统为类预先设计好的,只需要开发者实现的方法。魔术方法以__开始。构造方法、析构方法、克隆方法都是魔术方法。
  • 重载目的:不让程序允许出错,在类内部由我们自己控制内容的访问。

1. 属性重载

  • 当PHP对象访问不存在没有权限访问的属性时自动调用的方法。
方法名说明
__get($key)读属性时触发
__set($key, $value)写属性时触发
__isset($key)外部调用isset函数或empty函数时触发
__unset($key)外部调用unset函数删除对象属性时触发
__toString()对象被当成普通变量输出或连接时触发
<?php
class Human{
    private $age = 10;
    // 读取控制
    public function __get($name) {
        echo $name . '----' . __METHOD__;
        $allow = array('age');
        if (in_array($name, $allow)) {
            return $this->$name;
        }
        return false;
    }
    public function __set($name, $value) {
        echo $name . ":" . $value . "----" . __METHOD__;
    }
    public function __isset($name) {
        echo $name . '----' . __METHOD__;
    }
    public function __unset($name) {
        echo $name . '----' . __METHOD__;
    }
    public function __toString() {
        echo '----' . __METHOD__;
        return "123";
    }
}

2. 方法重载

  • 当PHP对象访问不存在没有权限访问的方法时自动调用的方法。
方法名说明
__call($function_name[,$args])对象调用不可调用方法时触发
__callStatic($function_name[,$args])类访问不可调用静态方法时触发
class Man {
    private function show() {}
    private static function show2() {}
    // 方法重载
    public function __call($name, $arguments) {
        // 允许访问的方法
        $allow = array('show');
        if (in_array($name, $allow)) return $this->$name($arguments);
        return false;
    }
    public static function __callStatic($name, $arguments) {
        // 不允许访问
        return false;
    }
}

七、对象遍历

  • 遍历对象是指将对象中所有公有属性以键值对的形式取出并进行访问。
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

真空度精密控制技术在液相透射电子显微镜液体厚度调节中的应用

摘要&#xff1a;为了实现液相电子显微镜的更广泛和更便捷应用&#xff0c;需要对微芯片中的液体样本厚度进行精密调控。本文基于透射显微镜中被检液体样本内外压差对应于液体厚度这一凸起变形膨胀的基本现象&#xff0c;提出了通过精确控制液体池内部真空度来实现液体厚度精密…

【大数据离线开发】7.4 HBase数据保存和过滤器

7.4 数据保存的过程 注意&#xff1a;数据的存储&#xff0c;都需要注意Region的分裂 HDFS&#xff1a;数据的平衡 ——> 数据的移动&#xff08;拷贝&#xff09;HBase&#xff1a;数据越来越多 ——> Region的分裂 ——> 数据的移动&#xff08;拷贝&#xff09; …

美国原装KEYSIGHT E4981A(安捷伦) E4981A电容计

KEYSIGHT E4981A&#xff08;安捷伦&#xff09; Keysight E4981A&#xff08;安捷伦&#xff09;电容计为生产线中的陶瓷电容器测试提供了高速、可靠的测量。E4981A 实现了电容从小到大的测量能力&#xff0c;测量准确。Agilent E4981A 电容计有助于提高测试吞吐量&#xff0…

Structure|Alphafold2在肽结构预测任务上的基准实验

​题目&#xff1a;Benchmarking AlphaFold2 on peptide structureprediction 文献来源&#xff1a;2023, Structure 31, 1–9 代码&#xff1a;基准实验&#xff0c;比较了比较多的模型 1.背景介绍 由2-50个氨基酸构成的聚合物可以称为肽。但是关于肽和蛋白质之间的差异还是…

树莓派4b系统安装

文章目录一.树莓派系统和工具下载二.树莓派系统烧录一.树莓派系统和工具下载 树莓派系统下载&#xff1a;https://www.raspberrypi.com/software/operating-systems/ 下载系统镜像写入工具&#xff1a;Win32DiskImager https://sourceforge.net/projects/win32diskimager/ …

仅作笔记用:Windows 10 继续使用 IE 浏览器(针对23年2月14日的系统更新)

2 月 14 日更新后有部分 Windows 10 的用户反映 IE 浏览器无法使用&#xff0c;打开后变成 Edge 浏览器。由于有少数业内业务仍然必须使用 IE 浏览器&#xff0c;这里稍微研究了一下解决方法。 打开 IE 浏览器的时候会出现“IE已经合并进Edge浏览器”的提示&#xff0c;此时千…

华为手表开发:WATCH 3 Pro(10)获取心率

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;10&#xff09;获取心率初环境与设备文件夹&#xff1a;文件新增第二页面引用包 import sensor from system.sensor;showHeartbeat.hmlshowHeartbeat.js修改首页 -> 新建按钮 “ 跳转 ”index.hmlindex.js 引用包&#xff1…

JVM系统优化实践(1):JVM概览

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;这是多年之前做过的学习笔记&#xff0c;今天再翻出来&#xff0c;觉得仍然是记忆犹新。「独乐乐不如众乐乐」&#xff0c;就拿出来分享给「众乐乐」吧。目前大多…

BCN科研试剂:1263166-91-1,endo BCN-O-PNB,ENDO BCN - 活性酯(P-NPC)

试剂基团反应特点&#xff1a;endo BCN-O-PNB中在有机溶剂中很容易与含胺分子发生反应&#xff0c;PNB 是一个很好的离去基团&#xff0c;BCN 用于无铜点击化学反应。结构式&#xff08;Structural&#xff09;&#xff1a;基础产品数据&#xff1a;CAS号&#xff1a;1263166-9…

合并两个有序链表——递归解法

题目描述21. 合并两个有序链表难度简单2922收藏分享切换为英文接收动态反馈将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a;输入&#xff1a;l1 [1,2,4], l2 [1,3,4]输出&#xff1a;[1,1,2,3,4,4]示例…

【项目精选】基于B2C的网上拍卖系统_秒杀与竞价

点击下载源码 伴随着网络技术的广泛应用和高速发展&#xff0c;随着人们生活节奏的越来越快&#xff0c;越来越多的人们开始在网络中寻求便利。网络购物具备了省时、省事、省心、高效等特点&#xff0c;从而广泛被大众接受&#xff0c;并逐渐渗透到人们的生活中&#xff0c;成为…

当越来越多的企业不再使用FTP,该用什么更好的方案替代?

FTP作为第一个完整的文件传输协议&#xff0c;在互联网技术发展史上具有浓墨重彩的意义&#xff0c;它解决了文件传输协议有无的问题&#xff0c;在全世界范围内被广泛使用。但如今&#xff0c;随着网络技术的发展&#xff0c;企业生产类型和生产资料的丰富化&#xff0c;文件传…

Linux 系统目录结构

登录系统后&#xff0c;在当前命令窗口下输入命令&#xff1a; ls / 你会看到如下图所示: 树状目录结构&#xff1a; 以下是对这些目录的解释&#xff1a; /bin&#xff1a; bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里…

米尔电子MYC-YT507H测试u8g2_OLED显示库

最近在测试u8g2库&#xff0c;准备是在单片机上使用的&#xff0c;不过目前我看到其也是支持了linux设备的&#xff0c;所以想着是不是能在T507上跑下。搜了下已经是有人做了移植了。官方现在应该也是支持了的&#xff0c;我选择别人开源的&#xff0c;因为介绍的还比较详细。开…

【基础语法】JavaScript 全栈体系(三)

JavaScript 基础 第三章 常量 一、常量的基本使用 概念&#xff1a;使用 const 声明的变量称为“常量”。使用场景&#xff1a;当某个变量永远不会改变的时候&#xff0c;就可以使用 const 来声明&#xff0c;而不是let。命名规范&#xff1a;和变量一致常量使用 // 声明一…

python 之 海龟绘图(turtle)

注&#xff1a;从个人博客园移植而来 使用简介 python 2.6引入的一个简单的绘图工具&#xff0c;俗称为海龟绘图。3.x以上使用的话&#xff0c;可通过pip进行安装&#xff0c;命令为&#xff1a; pip/pip3 install turtle如果出现如下错误&#xff1a; 解决方式&#xff1a; …

UOS桌面操作系统搭建open vxn服务

UOS系统搭建openVPN一、环境说明二、服务端配置1、软件安装2、创建目录用来存放生成证书中要用到的各种文件3、准备证书生成相关文件4 、准备生成证书用的CSR相关配置5、生成CA证书6、生成服务端证书7、使用CA给服务端证书签名8、生成DH证书9、生成ta密钥10、生成客户端证书&am…

07 二叉树

开始系统学习算法啦&#xff01;为后面力扣和 蓝桥杯的刷题做准备&#xff01;这个专栏将记录自己学习算法是的笔记&#xff0c;包括 概念&#xff0c; 算法运行过程&#xff0c;以及 代码实现&#xff0c;希望能给大家带来帮助&#xff0c;感兴趣的小伙伴欢迎评论区留言或者私…

CHAPTER 1 Web Server - apache(httpd)

Web Server - apache1.1 概念介绍1.1.1 什么是Web Service?1.1.2 什么是Web Server?1.1.3 常见的Web服务程序有哪些?1.2 httpd1.2.1 httpd和apache的区别关系1.2.2 httpd版本介绍1.2.3 httpd安装1. yum 安装2. 编译安装1.3 通过systemctl管理httpd1.3.1 配置文件原因1.3.2 为…

析构函数、拷贝构造

1、析构函数析构函数的定义方式函数名和类名相同&#xff0c;在类名前加~&#xff0c;没有返回值类型&#xff0c;没有函数形参&#xff08;不能重载&#xff09;当对象生命周期结束的时候&#xff0c;系统会自动调用析构函数先调用析构函数&#xff0c;再释放对象的空间析构函…