iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP面向对象02:面向对象高级
  • 810
分享到

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

php单例模式开发语言 2023-09-01 07:09:51 810人浏览 独家记忆
摘要

PHP面向对象02:面向对象高级 一、设计模式1. 单例模式2. 工厂模式 二、面向对象三大特性1. 封装2. 继承3. 多态 三、继承1. 实现继承2. 有限继承a. 属性都能继承b

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

一、设计模式

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. 工厂模式

  • 工厂模式是一种按需生产对象的模式。
  • 优点:方便后期对类的维护。
  • 缺点:随着功能增加,需要开发多个工厂。
phpclass 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关键字实现。
  • 实现继承关系后,子类对象可以访问父类被继承的成员。而父类对象不可以访问子类成员。
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. 父类私有方法不会被继承,所以不会被重写。
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,即当方法被访问时,哪个类访问就绑定那个类。
  • 静态延迟绑定需要使用到静态成员的重写。
class Human{    public static $name = 'Human';    public static function getName() {    // 静态绑定        echo self::$name."
"
; // Man访问,依旧输出Human的name // 静态延迟绑定 echo static::$name . "
"
; // Man访问,输出Man里面的name }}class Man extends Human{// 重写静态成员 public static $name = 'Man';}Man::getName();

6. 最终类和最终方法

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

7. 抽象类和抽象方法

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

四、接口

  • 接口,使用 interface 关键字定义,用来规范一些共性类必须实现的方法。
  • 接口不是类,不可以被实例化,只能被类实现。
  • 接口中只能定义公有抽象方法(在接口中的方法默认是抽象方法)和接口常量。
  • 类实现接口时,必须实现接口中所有的抽象方法。
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
trait Eat{    public $time = 100;    public function showtime(){        echo $this->time;    }}class Man{    // 引入trait公共代码    use Eat;}// 可以直接使用$man = new Man();$man->showtime();

2. 同时使用多个 trait

  • 一个类可以使用多个 trait
trait Eat{    ...}trait Sleep{    ...}class Man{    use Eat, Sleep;}
  • 多个 trait 有同名方法,处理冲突的方法是 insteadof 代理处理和对被替换方法使用别名。
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 方法 > 父类方法。
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()对象被当成普通变量输出或连接时触发
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;    }}

七、对象遍历

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

来源地址:https://blog.csdn.net/realoser/article/details/129120184

--结束END--

本文标题: PHP面向对象02:面向对象高级

本文链接: https://www.lsjlt.com/news/387721.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP面向对象02:面向对象高级
    PHP面向对象02:面向对象高级 一、设计模式1. 单例模式2. 工厂模式 二、面向对象三大特性1. 封装2. 继承3. 多态 三、继承1. 实现继承2. 有限继承a. 属性都能继承b...
    99+
    2023-09-01
    php 单例模式 开发语言
  • python高级-面向对象(11)
    一、面向过程和面向对象 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 二、类和对象 1、类的概念 面向对象编程的2个非常重要的概念:类和对象是面...
    99+
    2023-01-31
    面向对象 高级 python
  • Python面向对象高级编程
      1、__slots__ Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性 class Student(object): __slots__ = ('name',...
    99+
    2023-01-30
    面向对象 高级编程 Python
  • 面向对象
    面向对象 特性 class  object 封装、继承、多态 语法:属性、方法 构造函数(在实例化时做一些类的初始化的工作 该函数是用于传参数) 析构函数(在实例释放、销毁的时候自动执行的、通常用于一些收尾工作,如:关闭一些数据库链接,关...
    99+
    2023-01-30
    面向对象
  • python 面向对象、类、对象
    class 类 object 对象 object-oriented programming 面向对象,简称OOP attribute 属性 method 方法 inheritance 继承 python中通过类和对象来实现 ...
    99+
    2023-01-31
    面向对象 对象 python
  • Python面向对象之面向对象基本概念
    面向过程和面向对象概念 过程和函数:过程类似于函数,只能执行,但是没有返回结果;函数不仅能执行,还能返回结果。 面向过程和面向对象 基本概念 面向过程-怎么做 把完成某一个需求的所有步骤从头到尾逐步实现; 根据开发需求,将某些功能独立的...
    99+
    2023-01-31
    面向对象 基本概念 Python
  • PHP面向对象编程:高级特性详解
    php 的 oop 高级特性包括:接口:定义方法,确保不同类具有相似行为。多态性:子类对象实现父类方法,提供灵活性。命名空间:组织代码,避免命名冲突。特性:复用代码,无需继承即可添加方法...
    99+
    2024-05-10
    php 面向对象编程 php面向对象编程
  • python面向对象
    python面向对象 目录: 1.类的定义和使用 2.类的封装 3.类的继承 4.多态   1.类的定义和使用 查、增加、修改、删除、初始化方法、实例化 __init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这...
    99+
    2023-01-30
    面向对象 python
  • Python25 面向对象
    该文章部分转载,部分原创 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么...
    99+
    2023-01-31
    面向对象
  • Python3 面向对象
    Python3 面向对象 python是一门面向对象语言,在python中有一句话:一切都是对象 面向对象简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 ...
    99+
    2023-01-31
    面向对象
  • python3_07.面向对象
        面向对象程序设计的基本步骤:    1、根据功能、抽象业务对象。    2、构建独立的业务模块,利用封装、继承、多态等抽象业务需求。    3、编写程序。    4、以对象为单位输入参数、开展测试。global关键字用来在函数或其他...
    99+
    2023-01-31
    面向对象
  • python 面向对象
    面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序...
    99+
    2023-01-30
    面向对象 python
  • Python|面向对象
    #一、类、对象定义及使用 #定义类语法:class 类名(父类):代码块注意:()可有可无 #class Student: #class Student(): #创建对象(实例)语法:对象名=类名() 注意:Java语言在实例化对...
    99+
    2023-01-30
    面向对象 Python
  • python - 面向对象
    #python面向对象 - 类定义   注意:特殊方法"__init__"前后分别有两个下划线!!!   __init__方法可以理解成定义属性的方法,编辑器中会默认将属性都绑定到self中,在使用时直接self.shuxing 即可哟;...
    99+
    2023-01-31
    面向对象 python
  • 什么是面向对象,面向对象有哪些特征
    面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、CAD技术、人工智能等领域。面向对象特征主要有封装、抽象、继承、多态。 一、什么是面向...
    99+
    2023-10-29
    面向对象 特征 有哪些
  • 面向对象初识
    一、面向对象(OOP)基本概念     面向对象编程 —— Object Oriented Programming 简写 OOP 1.1 过程和函数 过程 是早期的一个编程概念 过程 类似于函数,只能执行,但是没有返回值 函数...
    99+
    2023-01-30
    面向对象
  • PHP面向对象编程:面向接口编程
    dip 是一种设计模式,通过创建依赖于接口而非具体实现的类来实现松耦合和易维护。好处包括灵活性、可测试性和可扩展性。要实现 dip,请定义接口、创建实现接口的类,并将接口作为依赖项传递给...
    99+
    2024-05-10
    php 面向对象 php面向对象编程
  • 【PHP】PHP的面向对象编程
    PHP面向对象编程是PHP编程的一个重要方向,它通过将数据和操作封装在对象中,使得代码更加模块化、可重用性和易于维护。本文将介绍PHP面向对象编程的基本概念、核心思想和常见应用,并探讨使用PHP面向对...
    99+
    2023-09-08
    php android 开发语言
  • 面向对象进阶
    isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance...
    99+
    2023-01-31
    进阶 面向对象
  • python面向对象,类
    1:类和对象    是面向对象中的俩个重要概念,类是对事物的抽象,比如人类,球类。对象是事物的实例,比如足球,篮球。球类可以对球的特征和行为进行抽象,然后可以实例化一个真实的球体出来。2:类的定义    类把需要的变量和函数组合成一起,这种...
    99+
    2023-01-31
    面向对象 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作