编程语言的三大范式:面向过程、面向对象、函数式编程。
面向对象的核心思想:对象、封装、可重用性、可扩展性。
对象的组成:
数组和对象序列化 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;
运行后报错:
原因在于不能访问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. 合理的异常处理:左边的是在异常发生时立刻捕获,右边的是分散抛异常集中捕获。
[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无法自动抛出异常,必须手动进行,使用set_error_handler 接管就可以主动抛出异常:
对于fetal error 这样的错误,需要使用 register_shutdown_function函数,会在PHP程序终止或者die时触发一个函数。
对于parse error 级别的错误,只能修改配置文件 php.ini,将错误写入日志,方便以后查询处理。
9. trigger_error 函数主动抛出一个错误。
【PHP面向对象】
4.1.$this 关键字:只能在一个类的内部使用
4.2.构造方法:__construct() 一个类只能创建一个构造方法,且不能主动被调用。
4.3.析构方法:__destruct() 与构造方法相对,对象在内存中被销毁前调用析构方法。该方法不能带有任何参数。
4.4.静态属性和静态方法:使用static修饰的属性和方法。不需要在类实例化的情况下就可以直接使用。
(4.4.1)静态属性属于类本身而不是属于类的任何实例。
(4.4.2)如果要在同一类的成员方法中访问静态属性,需要在前面加上操作符“self::”
(4.4.3)静态方法
4.5 类常量:需要大写,使用关键字const修饰。使用方法如下:
如果要在同一类的成员方法中访问类常量,需要在前面加上操作符“self::”
4.6 对象的“克隆”
通过clone克隆一个对象
__clone()方法
4.7 继承:extends
(4.7.1)案例:创建一个Student类,使其继承于已经存在的People类。
(4.7.2)使用parent:: 关键字,调用父类中的方法:
(4.7.3)使用instanceof运算符:检测当前对象实例是否属于一个类的类型,返回布尔。
(4.7.4)覆盖父类方法:也叫重写,要求覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回值类型。
(4.7.5)在父类和子类都定义了构造方法时,当子类的对象被创建后,将调用子类的构造方法,而不会调用父类的构造方法。(详见代码4.7.5)
4.8 抽象类和接口——都是不能被实例化的特殊类
(4.8.1)抽象类:使用abstract声明
(4.8.2)当某个类继承于抽象类时,必须包含该抽象类中定义的所有方法:
(4.8.3)定义接口:使用关键字interface,接口不能被实例化,所以不存在构造方法和析构方法。
(4.8.4)接口可以继承多个接口,但是不能继承类。实现接口的继承使用implements关键字。使用类实现接口时必须包含接口中定义的所有方法。
(4.8.5)抽象类与接口的区别:
4.9 多态——通过多种状态或阶段来描述相同对象的编程方式。多态将编程的重点放在了接口与父类上,而不必考虑对象属于哪个具体类的问题。[原书P159页]
(代码4.9.1)通过继承实现多态。(代码4.9.2)通过接口实现多态。
4.10 PHP5中的反射:通过访问已经存在的类和对象来获取其结构与内容的能力。
(4.10.1)映射类ReflectionClass:获取一个类的所有信息
(4.10.2)映射方法类 ReflectionMethod:获取某个类的方法
(4.10.3)映射参数类 ReflectionParameter:获取函数或方法的参数信息:
(4.10.4)映射属性类 ReflectionProperty:获取特定类的属性
4.11 PHP5中的特殊方法:魔术方法
(4.11.1)__toString()方法允许一个类决定当它被修改为string类型时是如何起作用的。
(4.11.2)__autoload()方法:在第一次引用一个类时调用的方法,使用该方法可以快速取得对象名称并自动载入当前页面。
(4.11.3)__get()和__set()方法
(4.11.4)__call()方法可以调用一些未定义对象方法的异常处理,使程序继续正常运行。该方法要传入两个参数,用来指定所要调用的方法名称及一个数组。
4.12 PHP5不支持的OOP特性:
(1)不支持命名空间
(2)不支持方法的重载
(3)不支持多重继承(PHP5.4可以用trait间接的实现多继承)
【代码】https://github.com/rxbook/study-php-object/tree/master/code04