面向对象思想的核心概念 #### 什么是类?什么是对象? 类是由属性和方法组成的抽象组织。 对象是类的具体存在。 #### 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 代码示例](https://github.com/FrankDiao/phpCoreTechnology-/blob/master/chapterOne/reflection.php "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 代码示例](https://github.com/FrankDiao/phpCoreTechnology-/blob/master/chapterOne/exception.php "github 代码示例") 代码示例中使用了set_error_handler函数接管了PHP的内置错误处理方式。 在发成错误时由自定义错误处理方法手动抛出一个异常,phper只需关心发生异常后的补救方式即可。 2018-12-29 PHP核心技术与最佳实践 展开评论