深入PHP面向对象、模式与实践(一)

一、PHP:设计与管理

二、PHP与对象

三、对象基础

A.类和对象

1.类是用于生成对象的代码模板

2.对象是根据类中定义的模板所构造的数据,对象可以被说成是类的“实例”,它是由类定义的数据类型

B.设置类中的属性

1.属性也被称为成员变量,用来有些存放对象之间互不相同的数据

2.不建议动态增加属性到对象

C.使用方法

1.方法是在类中声明的特殊函数,类似到函数声明,让对象执行任务

2.$this伪变量(pseudo-variable)把类指向一个对象实例

3.构造方法[constructor method,也称为构造器(constructor)]会被自动调用,可以用来确保必要的属性被设置,并完成任何需要准备的工作

D.参数和类型

1.基本类型

  • 判断基本类型:is_bool()、is_integer()、is_double()、is_string()、is_object()、is_array()、is_resource()、is_null()
  • Php是一种弱类型的语言,不能依靠编译器来防止类型相关的bug,必须考虑到当非法数据类型的参数传递给方法时,会产生怎样的后果

2.获得提示:对象类型

  • 方法定义清晰易懂,不用担心一些类型错误引起的bug
  • 不能用于强制规定参数为某种基本数据类型,如字符串和整型
  • 定义一个类也就定义了一个类型,但是一个类型可以用于描述一个家族的从多类

E.继承

1.子类继承父类的特性,这些特性由属性和方法组成。子类可以增加父类(也称为超类,superclass)之外 的新功能,因此子类也被称为父类的“扩展”

2.parent::调用父类方法

四、高级特性

A.静态方法和属性

1.通过对象访问方法和属性,这样的方法和属性是“静态的”(static),必须用static关键字来声明

2.静态方法是以类作为作用域的函数,静态方法不能访问这个类中的普通 属性,因为那些属性属于一个对象,但可以访问静态属性,如果修改了一个静态属性,那么这个类的所有实例都能访问这个新值

3.首先,它们在代码中的任何地方都可用(假设你可以访问该类)。其次,类的每个实例都可以访问类中定义的静态属性,所以你可以利用静态属性来设置值,该值可以被类的所有对象使用

B.常量属性

1.常量属性用const关键字来声明,不以美元符号开头,通常用大写字母来命名常量

2.常量属性只包含基本数据类型的值,不能将一个对象指派给常量

3.给已经声明过的常量赋值会引起解析错误

C.抽象类

1.不能直接实例人,只定义(或部分实现)子类需要的方法。子类可以继承它并且通过实现其中的抽象方法,使抽象类具体化

D.接口

1.接口只能定义功能,而不包含实现的内容

2.一个类可以同时继承一个父类和实现做任意个接口

E.延迟静态绑定:static关键字

1.static类似于self,但它指的是被调用的类而不是包含类

2.还可以作为静态方法调用的标识符,甚至是从非静态上下文中调用

F.错误处理

1.PHP5引入异常(exception),从PHP5内置的Exception类(或其子类)实例化得到的特殊对象,接受两个可选的参数,消息字符串和错误代码

G.Final类和方法

1.final关键字可以终止类的继承,final类不能有子类,final方法不能被覆写

H.使用拦截器

1.interceptor方法可以“拦截”发送到未定义方法和属性的消息

2.__get()、__set()用于处理类(或其父类)中未声明的属性

3.__isset()当客户在一个未定义的属性上调用isset()时调用,__unset()在一个未定义的属性被调用时调用

4.__call()方法,当客户端要调用类中未定义的方法时,__call()方法会被调用,接受两个参数,一个是方法的名称,另一个是传递给要调用方法的所有参数(数组),__call()方法返回的任何值都会返回给客户,就好像调用一个真实存在的方法一样

5.委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方替碑对象处理请求,使用委托可以在代码运行时改变使用的对象,具有更大的灵活性

I.析构方法

1.当一个对象调用unset()或进程中不同引用 某个对象时,对象就被销毁了

J.使用__clone()复制对象

1.clone使用“值复制”的方式(by-value copy)新生成一个对象

2.可以通过实现__clone()来达到控制复制什么,当调用clone时__clone()方法被调用

K.定义对象的字符串值

1.使用__toString()方法

L.回调、匿名函数和闭包

1.利用回调,可以在运行时将与组件的核心任务没有直接关系的功能插入到组件中,有了组件回调,就赋予了其他人在你不知道的上下文中扩展你的代码的权利

2.is_callable()非常智能,能够测试数组,数组形式的有效回调应该以对象作为其第一个元素,以方法名作为其第二个元素

3.use子句,可以让匿名函数追踪来自其父作用域的变量

https://github.com/zhangyue0503/php/blob/master/shenruphpmianxiangduixiangmoshiyushijian/4.php

五、对象工具

A.PHP和包

1.php5.3之前 ,开发人员必须 在全局上下文中命名文件,解决方案将包名放在类名前面,但项目越复杂后类名就会越长

2.使用命名空间

3.使用文件系统模拟包:require_once(),只在文件没有被包含过的情况下才能包含,require比include更好,require比require_once效率更高

4.PEAR风格的命名方式

6.包含路径

7.自动加载:__autoload($classname)

B.类函数和对象函数

1.PHP允许使用字符串来动态地引用类

2.class_exists()函数检查类是否存在

3.get_class()检查对象的类,instanceof对象是否属于某个类

4.get_class_methods(‘className’)得到一个类中所有方法的列表,is_callable(array(类名,方法名))、method_exists(类名,方法名)检查类中的方法可否被调用

5.get_class_vars()函数接受类名作为参数,返回类的属性数组

6.get_parent_class()来找到一个类的父类,is_subclass_of()函数检测类是否是另一个类的派生类,class_implements()使用一个类名或一个对象引用作为参数,并且返回一个由接口名构成的数组

7.call_user_func()可以调用方法或函数,要调用一个函数需要将字符串作为它的第一个参数,要调用类方法,需要数组,第一个元素是一个对象,第二个元素则是要调用的方法名

8.call_user_func_array()把目标方法所需的任何参数当做作数组来接受

C.反射API

1.ReflectionClass提供揭示给定类所有信息的方法,无论这个类是用户定义的还是PHP自带的内置类,相比var_dump()和print_r()提供的细节更多

2.ReflectionMethod对象可以用于检查类中的方法,通过ReflectionClass::getMethods或ReflectionClass::getMethod(‘')来获取

3.ReflectionParameter对象返回方法的参数信息,通过ReflectionMethod::getParameters()方法获取

https://github.com/zhangyue0503/php/blob/master/shenruphpmianxiangduixiangmoshiyushijian/5.php

六、对象与设计

A.代码设计的定义

1.“代码设计”:确定系统的需求、作用域和目标。是定义系统组成并组织各组件间关系的过程。

B.面向对象设计和过程式编程

1.面向对象和过程式编程的一个核心区别是如何分配职责。过程式编程表现为一系列命令和方法的连续调用。面向对象编程则将职责从客户端代码中移到专门的对象中,尽量减少相互依赖。

2.职责:过程式代码忙于处理细节,而面向对象代码只需一个接口即可工作,并且不用考虑实现的细节。由于实现由对象负责,而不是由客户端代码负责,所以我们能够很方便地增加对新格式的支持

3.内聚(cohesion):是一个模块内部各成分之间相关联程度的度量,理想情况下应该使各组件职责清晰、分工明确

4.耦合:当系统各部分代码紧密绑在一起时,就会产生紧密耦合,这时在一个组件中的变化会迫使其他部件随之改变,过程式代码比较容易产生耦合问题

5.正交(orthogonality):指将职责相关的组件紧紧组合在一起,而与外部系统环境隔开,保持独立。正交主张重用组件 ,期望不需要任何特殊配置就能把一个组件插入到新系统中。这样的组件有明确的与环境无关的输入和输出。

C.选择类

1.面向对象系统经常反映真实的事物,即定义一个类就是找到系统中的事物,然后通过方法给予他们动作

2.让一个类只有一个主要的职责,并且任务要尽可能独立

D.多态

1.多态:是指在一个公用接口后面维护多个实现,如果在代码中存在大量条件语句,就说明需要使用多态

2.多态并没有消除条件语句,但多态可以把条件代码集中到一个地方

3.PHP强制接口由抽象类定义,可以确定子类会实现抽象父类中定义的所有方法,包括类类型提示和方法的访问控制。客户端代码因此可以使用一个公共父类的任意子类而不需要改写代码

4.PHP无法强制规定类方法返回的数据类型,意味着不同的子类方法可能返回不同类型的对象或基本数据类型,可以靠人为的约定来使多个方法保持一致

E.封装

1.封装就是对客户端代码隐藏数据和功能,最简单的办法是将属性定义为private或protected。通过对客户端代码隐藏属性,我们创建了一个接口并防止在偶然情况下污染对象中的数据。

2.多态是另外一种封装。通过把不同的实现放在公共接口之后,我们对客户端代码隐藏了功能的实现。

3.从某种程度上说,封装是面向对象编程的关键。目标是使系统中的每一部分都尽可能独立

4.首先,封装可以帮助我们创建正交的代码。其次,封装的范围不怎么重要,无论封装的规模是大是小,类和客户端代码都必须同时关注封装的实现

F.忘记细节

1.可以只考虑系统中的关键参与者:项目需要的对象类型和这些对象的接口。不要被经验所左右,而要让代码中的结构和关系来引导你,你会发现一个定义良好的接口之后加入实现代码是很容易的。接着你可以灵活地选择、改进或扩展一个可能需要的实现,而不会影响到外界的系统

2.为了强调接口,按抽象基类而不是具体的子类来思考

3.“为接口而不是实现编程”

G.4个方向标

1.代码重复(duplication)

2.类知道的太多

3.万能的类

4.条件语句

H.UML

1.类图(class diagram)

七、什么是设计模式?为何使用它们

A.什么是设计模式

1.设计模式便是分析过的问题和问题解决方案所阐释的优秀实践

2.设计模式记录并规范化了这些问题及解决方案,使更广泛的开发社区可获得这些来之不易的经验。模式在本质上讲是(或者说应该是)自下而上而非自上而下的。它们来源于实践而不是空洞的理论。

3.每个模式都描述着一种在我们的环境中一遍又一遍地出现的问题,并描述了对该问题的核心解决方案,以此方式你可以使用该方案上百万次,而从不需要重复做同样的事情

B.设计模式概览

1.命名

2.问题

3.解决方案

4.效果

C.《设计模式》格式

1.意图:模式目的简要概括

2.动机:需要被解决的问题,通常根据一个典型的情况

3.适用性:检验不同情况下你是否可以应用某模式

4.结构/交互:可能包含UML类图和交互图,用于描述解决方案中类和对象之间的关系

5.实现:着眼于解决方案的细节

6.示例代码

7.已知应用

8.相关模式

D.为什么使用设计模式

1.一个设计模式定义了一个问题

2.一个设计模式定义了一个解决方案

3.设计模式是语言无关的

4.模式定义了一组词汇

5.模式是经过测试的

6.模式是为协作而设计的

7.设计模式促进良好设计

原文发布于微信公众号 - 硬核项目经理(fullstackpm)

原文发表时间:2017-05-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券