PHP面向对象笔记04

编程语言的三大范式:面向过程、面向对象、函数式编程。

面向对象的核心思想:对象、封装、可重用性、可扩展性。

 

对象的组成:

PHP面向对象笔记04_第1张图片

 

 

数组和对象序列化 serialize 之后的结果是一样的。

对象和数组的区别:对象有个指针,指向了它所属的类。

 

 

1.2 魔术方法 set get

class Account{

    private $user=1;

    private $pwd=2;

}

$a = new Account();

echo $a->user;

$a->name = 5;

echo $a->name;

echo $a->big;

 

运行后报错:

PHP面向对象笔记04_第2张图片

原因在于不能访问Account对象的私有属性user。

 

 

1.3 继承与多态

[1.3.1 类的组合与继承]

1. 继承和多态都是对类进行复用,继承是类级别的复用,多态是方法级别的复用。

2. 子类继承父类的属性和方法,成为继承。

3. 在继承中,用parent指代父类,用self指代自身,用“:” 运算符(范围解析操作符)调用父类的方法。

4. 静态:如果声明类成员或方法为static,就可以不实例化类而直接访问,也不能用“:”访问一个非静态方法,如果这样会导致E_STRICT 级别的错误。php.ini:

5.继承最大的优点是扩展简单,但是其缺点大于优点。一般继承树不要多于三层。若要禁止被继承,使用final修饰符。

6.PHP5.4 出来的 Traits

 

[1.3.2-各种语言中的多态]

7.PHP是弱类型,实现多态更简单、更灵活。

 

1.4 接口 interface

1. PHP 中接口的语义是有限的,使用接口的地方并不多,可以更多的使用抽象类。

2. SPL(标准PHP库),实现一些接口,最主要的就是iterator迭代器接口。

3. toString方法就是接口的一种变相实现;Traits可以被视为一种加强型的接口。

4. 接口只是一个声明,一旦使用interface关键字,就应该实现它。

 

1.5 反射 ReflectionClass

1.使用class函数返回对象属性的关联数组:

    ① get_object_vars($obj);  //返回对象属性的关联数组

    ② echo get_class($obj);  //获取对象属性列表所属的类

    ③ get_class_vars(get_class($obj));  //类属性

    ④ get_class_methods(get_class($obj));  //返回由类的方法名组成的数组

2. 反射完整的描述了一个类或者对象的原型,不仅可以用于类和对象,还可以用于函数、扩展模块、异常。

3. 反射的消耗很大,能找到替代方案的情况下就不要滥用。

 

1.6-异常和错误处理

1. 异常(exception)和 错误(error)是不一样的。PHP一旦遇到非正常代码,就会触发错误,而不是抛出异常。

2. 对于除0,Java认为是异常,二PHP认为是错误。

3. PHP内建的常见异常类主要有 pdoexception、reflection exception

4. 如下三种场景会用到异常处理机制:

    ① 对程序的悲观预测

    ② 程序的需要和对业务的关注

    ③ 语言级别的健壮性要求

5. 合理的异常处理:左边的是在异常发生时立刻捕获,右边的是分散抛异常集中捕获。

PHP面向对象笔记04_第3张图片

 

[1.6.3-PHP中的错误级别 ]

6.PHP的错误是会使脚本运行不正常的情况,大致分为:(按照顺序依次级别由低到高)

    ① deprecated        最低级别的错误,表示“不推荐,不建议”;

    ② notice            语法中存在不当的地方;

    ③ warning           级别比较高的错误,在语法中出现很不恰当的情况下会报此错误;

    ④ fetal error       致命错误,导致PHP流程终止,后面的代码不再执行;

    ⑤ prase error       最高级别的错误,语法解析错误。

7.error_reporting 指定错误级别,一般要屏蔽所有错误输出,使用:error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE  & ~E_WARNING);

 

[1.6.4-PHP中的错误处理机制 ]

★ 无论是错误还是异常,都可以使用handler接管 系统已有的 处理机制。

8. set_error_handler 接管PHP错误处理,restore_error_handler() 取消接管。

set_error_handler(error_function,error_types);

PHP面向对象笔记04_第4张图片

由于PHP无法自动抛出异常,必须手动进行,使用set_error_handler 接管就可以主动抛出异常:

PHP面向对象笔记04_第5张图片

 

对于fetal error 这样的错误,需要使用 register_shutdown_function函数,会在PHP程序终止或者die时触发一个函数。

PHP面向对象笔记04_第6张图片

 

对于parse error 级别的错误,只能修改配置文件 php.ini,将错误写入日志,方便以后查询处理。

 

9. trigger_error 函数主动抛出一个错误。

PHP面向对象笔记04_第7张图片

 

 

PHP面向对象】

4.1.$this 关键字:只能在一个类的内部使用

PHP面向对象笔记04_第8张图片

PHP面向对象笔记04_第9张图片

4.2.构造方法:__construct() 一个类只能创建一个构造方法,且不能主动被调用。

PHP面向对象笔记04_第10张图片

PHP面向对象笔记04_第11张图片

4.3.析构方法:__destruct() 与构造方法相对,对象在内存中被销毁前调用析构方法。该方法不能带有任何参数。

PHP面向对象笔记04_第12张图片

PHP面向对象笔记04_第13张图片

4.4.静态属性和静态方法:使用static修饰的属性和方法。不需要在类实例化的情况下就可以直接使用。

(4.4.1)静态属性属于类本身而不是属于类的任何实例。

(4.4.2)如果要在同一类的成员方法中访问静态属性,需要在前面加上操作符“self::

PHP面向对象笔记04_第14张图片

(4.4.3)静态方法

PHP面向对象笔记04_第15张图片

4.5 类常量:需要大写,使用关键字const修饰。使用方法如下:

如果要在同一类的成员方法中访问类常量,需要在前面加上操作符“self::

PHP面向对象笔记04_第16张图片

 

4.6 对象的“克隆”

通过clone克隆一个对象

__clone()方法

PHP面向对象笔记04_第17张图片

PHP面向对象笔记04_第18张图片

 

4.7 继承:extends

PHP面向对象笔记04_第19张图片

(4.7.1)案例:创建一个Student类,使其继承于已经存在的People类。

PHP面向对象笔记04_第20张图片

(4.7.2)使用parent:: 关键字,调用父类中的方法:

PHP面向对象笔记04_第21张图片

(4.7.3)使用instanceof运算符:检测当前对象实例是否属于一个类的类型,返回布尔。

PHP面向对象笔记04_第22张图片

(4.7.4)覆盖父类方法:也叫重写,要求覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回值类型。

PHP面向对象笔记04_第23张图片

(4.7.5)在父类和子类都定义了构造方法时,当子类的对象被创建后,将调用子类的构造方法,而不会调用父类的构造方法。(详见代码4.7.5

 

4.8 抽象类和接口——都是不能被实例化的特殊类

(4.8.1)抽象类:使用abstract声明

PHP面向对象笔记04_第24张图片

(4.8.2)当某个类继承于抽象类时,必须包含该抽象类中定义的所有方法:

PHP面向对象笔记04_第25张图片

(4.8.3)定义接口:使用关键字interface,接口不能被实例化,所以不存在构造方法和析构方法。

PHP面向对象笔记04_第26张图片

(4.8.4)接口可以继承多个接口,但是不能继承类。实现接口的继承使用implements关键字。使用类实现接口时必须包含接口中定义的所有方法。

PHP面向对象笔记04_第27张图片

(4.8.5)抽象类与接口的区别:

PHP面向对象笔记04_第28张图片

 

4.9 多态——通过多种状态或阶段来描述相同对象的编程方式。多态将编程的重点放在了接口与父类上,而不必考虑对象属于哪个具体类的问题。[原书P159]

(代码4.9.1)通过继承实现多态。(代码4.9.2)通过接口实现多态。

PHP面向对象笔记04_第29张图片

 

4.10 PHP5中的反射:通过访问已经存在的类和对象来获取其结构与内容的能力。

PHP面向对象笔记04_第30张图片

(4.10.1)映射类ReflectionClass:获取一个类的所有信息

PHP面向对象笔记04_第31张图片

PHP面向对象笔记04_第32张图片

(4.10.2)映射方法类 ReflectionMethod:获取某个类的方法

PHP面向对象笔记04_第33张图片

(4.10.3)映射参数类 ReflectionParameter:获取函数或方法的参数信息:

PHP面向对象笔记04_第34张图片

(4.10.4)映射属性类 ReflectionProperty:获取特定类的属性

PHP面向对象笔记04_第35张图片

 

4.11 PHP5中的特殊方法:魔术方法

(4.11.1)__toString()方法允许一个类决定当它被修改为string类型时是如何起作用的。

PHP面向对象笔记04_第36张图片

(4.11.2)__autoload()方法:在第一次引用一个类时调用的方法,使用该方法可以快速取得对象名称并自动载入当前页面。

PHP面向对象笔记04_第37张图片

(4.11.3)__get()__set()方法

PHP面向对象笔记04_第38张图片

(4.11.4)__call()方法可以调用一些未定义对象方法的异常处理,使程序继续正常运行。该方法要传入两个参数,用来指定所要调用的方法名称及一个数组。

PHP面向对象笔记04_第39张图片

 

4.12 PHP5不支持的OOP特性:

(1)不支持命名空间

(2)不支持方法的重载

(3)不支持多重继承(PHP5.4可以用trait间接的实现多继承)

 

【代码】https://github.com/rxbook/study-php-object/tree/master/code04

你可能感兴趣的:(PHP面向对象笔记)