[php]面向对象及设计模式

面向过程与面向对象

  • 面向过程:把所有事物看做一整个运行过程。
  • 面向对象:把所有事物看做一个个对象交互运行。
  • 对象:具体到哪一个事物,如猫,狗,人

对象 (归纳,总结)抽象 成为类
类 (具体化实现)实例化 成为对象

属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段就可以得到其值,而不依赖于运行的信息才能求值。如可用常数5,而不能用7-2获得。

对象的三大特性

封装

尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口,使之与外部发生联系。

  • 访问控制(可见性约束)
    public / protected / private

  • __construct 构造函数
    具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

  • __destruct 析构函数
    析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
    点击查看官网更多信息

  • static 关键字

  1. 放在函数内部修饰变量,在函数执行完后,变量值仍然保存
  2. 修饰属性或方法,可以通过类名访问,如果是修饰的是类的属性,保留值
  3. 放在类的方法里修饰变量
  4. 修饰在全局作用域的变量
  5. PHP里面只有全局作用域和函数作用域,没有块作用域
    点击查看参考资料
  • const 关键字
    标识的常量的属性是只读的,不能重新赋值,所以一定要在定义的时候初始化。使用const声明的常量名称前不要使用“$”符号,并且常量名通常都是大写的。
    点击查看官网更多信息

  • 调用方式

  1. ->(对象运算符)访问非静态属性
  2. 当一个方法在类内部被调用,可用伪变量$this
  3. conststatic修饰的,内部外部都可以用类名::属性,类名::方法名,内部,self::属性名self::方法名
  • 重载

当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。

  1. 属性重载
    __get() 在读取不可访问的属性时被自动调用
    __set() 在给不可访问的属性赋值时被自动调用
    __isset() 当对不可访问的属性调用isset()empty()时被自动调用
    __uset() 当于不可访问的属性调用unset()时被自动调用
  2. 类重载
    __call() 在对象中调用一个不可访问的方法时被自动调用
    __callStatic() 在静态上下文中调用一个不可访问的方法时,被自动调用
    __toString() 一个类被当成字符串时被自动调用
    __invoke() 当尝试以调用函数的方式调用一个对象时被自动调用
继承
  • extends 继承
    子类继承父类所有公有的受保护的属性和方法。
  • 重写:
    继承父类中的方法,子类中定义的与父类同名的方法,关键字parent::访问父类中的被重写的方法与属性。
    • final 关键字
      如果父类中的方法被声明为final,则子类无法重写该方法
      如果一个类被声明为final,则不能被继承
      $thisparent::self::
多态

接口的多种不同的实现方式即为多态。同一操作,作用于不同的对象,可以有不同的解释,产生不同的执行结果。

  • 抽象类
    至少要有一个方法时抽象方法,声明关键字 abstract ,抽象方法只是声明了其调用方式(参数),不能定义其具体的功能实现。--->不能被实例化

  • 修饰关键词顺序

  1. 类的属性和方法必须添加访问修饰符(privateprotectedpublic
  2. abstract 以及 final 必须声明在访问修饰符之前
  3. static 必须在访问修饰符之后
  • 接口
    使用接口,可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容,不能有方法的具体定义和变量属性,只声明了方法名称和常量,接口中可以定义常量
    定义关键词:interface
    实现关键字:implements 一个类可以实现多个接口
    继承关键字:extends
    类实现接口: class A implements Ainter
    完全写法: class A extends B implements Ainter,Binter
    接口继承接口:Ainter extends Binter
条件约束
  • instanceof 类型运算符
  1. 用于确定一个 PHP 变量是否属于某一类 class 的实例
  2. 也可用来确定一个变量是不是继承自某一父类的子类的实例
  3. 检查一个对象是否不是某个类的实例
  4. instanceof也可用于确定一个变量是不是实现了某个接口的对象的实例
    点击查看官网更多信息
类的自动加载
命名空间

用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
    查看官网更多关于命名空间的信息
PHP面向对象高级特性
  • SPL库的使用(PHP 标准库)
  1. SplStack 类通过使用一个双向链表来提供栈的主要功能。
  2. SplQueue 类通过使用一个双向链表来提供队列的主要功能。
  3. SplHeap类提供堆的主要功能。
  4. SplFixedArray类提供了array的主要功能。SplFixedArray与普通PHP数组的主要区别在于,SplFixedArray的长度是固定的,并且只允许将范围内的整数作为索引。优点是它允许更快的数组实现。
    点击查看官网数据结构更多信息
  • 迭代器
  1. ArrayIterator 类 这个迭代器允许在遍历数组和对象时删除和更新值与键。
  2. AppendIterator 这个迭代器能陆续遍历几个迭代器
    查看官网更多迭代器信息
  3. ArrayObject 允许对象作为数组工作。
    查看官网更多类和接口

设计模式

  1. 工厂模式:工厂方法或者类生成对象,而不是在代码中直接new
  2. 单例模式:使某个类的对象仅允许创建一个
  3. 注册树模式:全局共享和交换对象
  4. 适配器模式:可以将截然不同的函数接口封装成统一的接口
  5. 策略模式:将一组特定的行为和算法封装成类,以适应某种特定的上下文环境。--->可以实现IOC,依赖倒置,控制反转
  6. 数据对象映射模式:将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。
  7. 观察者模式:当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新---->实现了低耦合,非侵入式的通知和更新机制
  8. 原型模式:与工厂模式类似,都是用来创建对象,与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了创建对象时重复的初始化操作,原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会开销很大,原型模式仅需要内存拷贝即可。
  9. 装饰器模式:可以动态的添加修改类的功能,一个类提供一个功能,如果需要修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现它的方法,使用装饰器模式,仅需要在运行时添加一个装饰器对象,即可实现,可以实现最大的灵活性。
  10. 迭代器模式:在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素,相比较传统的编程模式,迭代器模式可以隐藏遍历元素的所需操作。
  11. 代理模式:在客户端与实体之间创建一个代理模式(proxy),客户端对实体进行操作,全部为派给代理对象,隐藏实体的具体实现细节。Proxy还可以与业务代码分离,部署到另外的服务器,业务代码中通过RPC来委派任务
    查看更多PHP设计模式信息

面向对象编程的基本原则

  1. 单一职责:一个类,只需要做好一件事
  2. 开放封闭:应该是可扩展的,而不可修改的
  3. 依赖倒置:一个类,不应该强依赖于另外一个类,每个类对于另外一个类,都是可替换的
  4. 配置化:尽可能的使用配置,而不是硬编码
  5. 面向接口编程:只需要关心接口,不需要关心实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值