面向对象思想的核心概念

什么是类?什么是对象?#

类是由属性和方法组成的抽象组织。
对象是类的具体存在。

PHP 中都有哪些魔术方法?它们的作用分别是什么?#

PHP 中由__(两个下划线) 开头的方法开头的都是魔术方法 (自定义的方法不属于)。

常用的魔术方法有:

  1. __set($name,$value)
  2. __get($name)
  3. __call($name,$args)
  4. __callStatic()

以上 4 个魔术方法的作用都是在对象调用不存在的属性或方法时,使程序不会报错的一种兼容操作。
set 和 get 作用于属性
call 作用于方法
callStatic 作用于静态方法

5. __toString()#

toString 方法相当于一种序列化方式,例如将一个对象使用 toString 方法转换为一个字符串,使用 echo 输出。
PHP 中的序列化方法还有 json_encode、serialize… 它们本质上是相同的。

6. __construct()#

初始化方法。
在实例化一个对象时会先调用此方法,常用于对象的初始化操作。
在 PHP5.3.3 之前初始化方法为与类命相同的方法,在 5.3.3 之后为了满足兼容性,如果类中没有 construct 方法并且也没有葱父类继承,PHP 会尝试寻找旧式方法。

7. __destruct()#

析构方法。
在程序终止时调用。包括 exit () 或者 die ()

反射是什么?反射的作用是什么?#

反射的简单解释是:根据到达地找到来源地。
面向对象编程赋予了对象的自省能力即反射 API,通过反射可以获取或导出类,也可以获取到类的方法、属性包括注释和私有。
so 反射常用于自动生成文档等。

反射的应用,实现一个简单示例#

github 代码示例
代码示例通过反射 API 简单实现了:

  1. 获取类命
  2. 获取类中的所有常量
  3. 获取类中的所有属性 (属性名、属性值、静态属性、权限修饰符)
  4. 获取类中的所有方法 (方法名、注释、参数、静态方法、权限修饰符)

简述继承、多态和组合#

继承和多态同属于面向对象的三大特征之一。
继承是指一个类通过 extends 或其他关键字成为另一个类的子类。
多态是指同一个类的对象收到相同的消息时会得到不同的结果。
组合是指通过属性的方式得到某个对象。
继承、组合和多态的意义归根结底都是为了简化代码提高复用性,不同的是继承是用于类的复用,多态是用于方法的复用。
在 PHP 中多态的实现不是很好,原因在于 PHP 是一门动态语言,PHP 本身就是多态。

继承与组合的区别#

继承是一种 “是,像” 的关系;
组合是一种 “需要” 的关系;

继承与组合的优劣势#

继承的优点:

  • 大大简化了代码

继承的缺点:

  • 破坏了封装性
  • 耦合度太高
  • 扩展时复杂性提高
  • 不恰当的使用会破坏现实世界的逻辑

so 在情况允许的前提下优先考虑组合

简述 PHP 中的 Interface#

Interface 即接口,其起到的主要为 “契约、规范” 的作用。
接口类似于抽象类,其没有方法主体
被 implements 关键字实现的类必须实现接口中的所有方法。
“契约” 作用也就是说接口中定义的方法实现类必须全部实现,否则会报错。

但 PHP 中的接口没有起到起到这样的作用,例如调用一个接口不存在的方法 PHP 也不会报错,所以显得有点鸡肋。

简述 PHP 中的异常处理机制。#

PHP 将所有的程序异常都视作错误。
在 PHP 中所有的异常必须手动抛出才会被捕获到。

如何接管 PHP 内置的错误处理#

通过 set_error_handler () 函数可以接管。
其定义如下

mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

实现一个类 Java 的异常处理机制#

github 代码示例

代码示例中使用了 set_error_handler 函数接管了 PHP 的内置错误处理方式。
在发成错误时由自定义错误处理方法手动抛出一个异常,phper 只需关心发生异常后的补救方式即可。

本作品采用《CC 协议》,转载必须注明作者和本文链接