【PHP入门系列】3-PHP面向对象

只总结纪录自己学习的知识点,想要了解PHP自行搜索就行了。毕竟比较老的语言了,比较成熟了资料也比较多。

面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构。OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP达到的软件工程的三个目标:重用性、灵活性、拓展性。PHP面向对象借鉴了JAVA,先看看基本的语法吧。

PHP 具有完整的对象模型。特性包括: 访问控制抽象类final 类与方法,附加的魔术方法接口对象复制。PHP 对待对象的方式与引用和句柄相同,即每个变量都持有对象的引用,而不是整个对象的拷贝。参见 对象和引用

基本语法

面向对象编程的三大基本要素:封装、继承、多态,基本上一个文件一个类,类文件内无过程、类内只能有,方法。

  • 每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。
  • 类的变量成员叫做“属性”,或者叫“字段”、“特征”,在本文档统一称为“属性”。属性声明是由关键字 public,protected 或者 private 开头,然后跟一个普通的变量声明来组成。
  • 可以把在类中始终保持不变的值定义为常量。const关键字
  • __construct PHP 允许开发者在一个类中定义一个方法作为构造函数。
  • __destruct 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

封装与解封

封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节。

  • 一是把对象的全部属性和全部服务结合在一起,形成一个不可分割的单独单位(对象)
  • 二是信息隐蔽,尽可能的隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口与外部发生联系

对属性或方法的访问控制(PHP 7.1.0 以后支持常量),是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。 被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。

不过利用PHP的魔术方法可以对封装的进行解封:

  • __get()方法用来获取私有成员属性值,有一个参数,参数传入要获取的成员属性的名称,或者返回获取的属性值。
  • __set()方法用来为私有成员属性设置值,有二个参数,第一个参数为要设置的属性名,第二个参数是要给属性的值。

继承与重载

关键字extends。继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。一个类只能直接从一个类中继承数据(单继承)继承是把父类的成员属性和方法复制过来。

类的重载就是定义相同的方法名。调用父类被覆盖的方法:

  • 一种是使用父类的“类名::”来调用父类中被覆盖的方法
  • 二种是使用“parent::”来调用父类中被覆盖的方法

抽象类和接口

抽象类关键字abstract

定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

  • 一个抽象类中至少有一个抽象方法
  • 抽象类、抽象方法前都必须使用abstract声明
  • 抽象方法无大括号
  • 继承后要将所以的抽象方法都要进行重载

抽象类一般为了规范一个类的使用,规范子类的实现。

对象接口关键字interface

接口就是一种契约。因此,在程序里,接口的方法必须被全部实现,否则将报 fetal 错误。

  • 接口不能被实例化只能被implements(引用)
  • 谁引用谁重载,引用后要将所有接口所有抽象方法重载
  • 单继承多引用 先继承后引用
  • 接口中所有的方法都是抽象的
  • 所有的成员属性都是常量
  • 成员方法前面无需使用abstract关键字
  • 所有属性和方法必须是公共的

在实践中,往往出于两个辅助目的使用接口来规范项目的抒写:

  • 因为实现了同一个接口,所以开发者创建的对象虽然源自不同的类,但可能可以交换使用。 常用于多个数据库的服务访问、多个支付网关、不同的缓存策略等。 可能不需要任何代码修改,就能切换不同的实现方式。
  • 能够让函数与方法接受一个符合接口的参数,而不需要关心对象如何做、如何实现。 这些接口常常命名成类似 Iterable、Cacheable、Renderable, 以便于体现出功能的含义。

静态(static)关键字
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可

Final 关键字

如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。final等于方法到此为止。

魔术方法

__construct()__destruct()__call()__callStatic()__get()__set()__isset()__unset()__sleep()__wakeup()__serialize(), __unserialize(), __toString()__invoke()__set_state()__clone()__debugInfo() 等方法在 PHP 中被称为魔术方法(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。PHP 通过反射 API 和魔术方法,可以实现多种方式的元编程。

Trait代码复用

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

关于Trait的优先级,从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

你可能感兴趣的:(php)