PHP核心技术与最佳实践(一)

一、面向对象思想的核心概念

1.面向对象思想的核心思想是对象、封装、可重用性和可扩展性。面向对象是建立在面向过程之上的更高层次的抽象。

2.面向对象和具体的语言无关。

A.百度对象的“形”与“本”

1.类是我们对一组对象的描述

①类定义了一系列的属性和方法,并提供了实际的操作细节,这些方法可以用来对属性进行加工

②对象含有类属性的具体值,这就是类的实例化

②类与对象的关系似一种服务与被服务、加工与被加工的关系

2.所谓序列化,就是把保存在内存中的各种对象状态(属性)保存起来,并且在需要时可以还原出来

3.对象和数组的区别在于:对象还有个指针,指向了它所属的类

4.对象和类:

①类是定义一系列属性和操作的模板,而对象则把属性进行具体化,然后交给类处理

②对象就是数据,对象本身不包含方法,但是对象有一个“指针”指向一个类,这个类里面可以有方法

③方法描述不同属性所导致的不同

④类和对象不是可分割的,有对象就必定有一个类和其对应,否则这个对象也就成了没有亲人的孩子

B.魔术方法应用

1.魔术方法是以两个下划线开头、具有特殊作用的一些方法,可以看做PHP的“语法糖”。

2.php的重载与Java的不同,构造函数不属于重载,而__set、__get属于重载。php的重载指动态地“创建”类属性和方法。

3.当调用一个不可访问的方法(如未定义或不可见)时,__call()会被调用,实际 上,魔术方法使方法的动态创建变为可能,这在MVC等框架设计中是很有用的语法。

C.继承与多态

1.用“::”访问一个非静态方法不符合语法,但PHP仍然能够正确地执行代码,这只是PHP的一个“兼容“或者说是”让步”,修改error_reporting打开e_strict报错就会出错

2.耦合是一个软件结构内不同模块之间互连程序的度量,也就是不同模块之间的依赖关系

低耦合是指模块与模块之间,尽可能地例模块间独立存在;模块与模块之间的接口尽量少而简单

更倾向于使用组合,因为:

①继承破坏封装性

②继承是紧耦合的

③继承扩展复杂

④不恰当地使用继承可能违反现实世界中的逻辑

3.组合需要一一创建局部对象,增加代码量

4.如何使用继承:

①精心设计专门用于被继承的父类,继承树稳定,不超过3层

②对于不是专门用于被继承的类,禁止其被继承

③优先考虑用组合关系提高代码的可重用性

④子类是一种特殊的类型,而不只是父类的一个角色

⑤子类扩展,而不是覆盖或者使父类的功能失效

⑥底层代码多用组合,顶层/业务层代码多用继承

5.多态:同一类的对象收到相同消息时,会得到不同的结果,而这个消息是不可预测的,顾名思义,就是多种状态,多种结果。

6.多态的真正意义是:在实际开发中,只要关心一个接口或基类的编程,而不必关心一个对象所属于的具体类。

7.PHP是弱类型的,并且也没有对象转换机制,所以不能像C++或Java那样实现派生类对象赋值给基类对象(calss a = new class b),所以PHP的父类重载不是多态。PHP的接口实现属于多态。

8.区别是否多态的关键在于看对象是否是同一类型。多态的本质就是if...else,只不过实现的层级不同。

D.面向接口编程

1.接口定义一套规范,描述一个“物”的功能,要求如果现实中的“物”想成为可用,就必须实现这些基本功能。接口这样描述自己:“对于实现我的所有类,看起来都应该像我现在这个样子”。“接口为抽象而生”。因此,在程序里,接口的方法必须被全部实现,否则将报fetal错误。

2.接口不仅规范接口的实现者,还规范接口的执行者,不允许调用接口中本不存在的方法。当然这并不是说一个类如果实现了接口,就只能实现接口中才有的方法,而是说,如果针对的是接口,而不是具体的类,则只能按接口的约定办事。

3.PHP的接口在“面向契约编程”中是不足的,可以淡化为设计文档,起到一个团队基本契约的作用。由于PHP是弱类型,且强调灵活,所以并不推荐大规模使用接口,而是仅在部分“内核”代码中使用接口。

4.接口本身什么也不做,系统悄悄地在内部实现了接口的行为。Traits可以被视为一种加强型的接口。

E.反射

1.直观理解就是根据到达地找到出发地和来源。在PHP运行状态中,扩展分析PHP程序,导出或提取出半天类、方法、属性等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射。

2.反射不仅可以用于类和对象,还可以用于函数、扩展模块、异常等

3.用一反射的地方:一个是对对象进行调试,另一个是获取类的信息。反射的消耗很大,在可以找到替代方案的情况下,就不要滥用。

4.很多时候,善用反射能保持代码的优雅和简洁,但反射也会破坏类的封装性,因为反射可以使本不应该暴露的方法或属性被强制暴露了出来,这既是优点也是缺点。

F.异常和错误处理

1.PHP里的异常,是程序运动中不符合预期的情况及与正常流程不同的状况。一种不正常的情况,就是按照正常逻辑不该出错,但仍然出错的情况,这属于逻辑和业务流程的一种中断,而不是语言错误。PHP里的错误则属于自身问题,是一种非法语法或者环境问题导致的、让编译器无法通过检查甚至无法运行的情况。

2.在PHP里,任何自身错误都会触发一个错误,而不是抛出异常(对于一些情况,倒同时抛出错误和异常)。PHP一旦遇到非正常代码,通常都会触发错误,而不是抛出异常。在这个意义上,如果想使用异常处理不可预料的问题,是办不到的。比如,想在文件不存在且数据库链接打不开时触发异常是不可行的,这在PHP中作为错误抛出,而不会作为异常自动捕获。

3.PHP通常是无法捕获有意义的异常的,它把所有不正常的情况都视为了错误,你要想捕获这个异常,就得使用if...else结构。

4.什么时候使用异常处理机制:

①对程序的悲观预测

②程序的需要和对业务的关注:异常处理机制可以把每一件事当做事务考虑,还可以把异常看成一种内建的恢复系统

③语言级别的健壮性要求:try..catch的好处就是,可以把异常千万的逻辑中断破坏降到最小范围内,并且经过补救处理后不影响业务逻辑的完整性;乱抛异常和只抛不捕获,或捕获而不补救,会导致数据混乱。

5.PHP错误就是会使脚本运行不正常的情况,错误级别:

①deprecated:表示“不推荐,不建议”

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

③warning:在语法中出现很不恰当的情况时,比如函数参数不匹配等,要修改代码

④fetal error:致命错误,直接导致php流程终结,后面的代码不在执行,必须修改代码

⑤prase error:语法解析错误,导致PHP代码无法通过语法检查

6.PHP中的错误处理:

①set_error_handler()设置用户自定义的错误处理函数,如果使用该函数,会绕过php的错误处理函数,可以使用restore_error_handler()取消接管

②trigger_error函数可以抛出错误

https://github.com/zhangyue0503/php/blob/master/phphexinjishuyuzuijiashijian/1.php

二、面向对象的设计原则

A.单一职责原则(SRP):就一个类而言,应该只有一个引起它变化的原因。就是怎么样设计类以及类的方法界定的问题。

一是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多的职责。

为什么要遵守SRP呢?

①可以减少类之间的耦合

②提高类的复用性

2.工厂模式:在代码执行时实例化对象,负责生产对象,根据不同的参数生成不同的实例化对象。

3.命令模式:分离命令请求者和命令实现者。

4.一直简单的应该遵循的做法:

①根据业务流程,把业务对象提炼出来

②职责的分类需要注意

B.接口隔离原则(ISP):如果一个模块包含多个子模块,那么我们应该小心对该模块做出抽象;表明客户端不应该被强迫实现他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个子模块,简单地说,就是使用多个专门的接口比使用单个接口要好得多。

1.主要观点:

①一个类对另外一个类的依赖性应当是建立在最小的接口上的。ISP可以达到不强迫客户依赖于他们不用的方法;ISP还可以降低客户之间的相互影响

②客户端程序 不应该依赖它不需要的接口方法(功能)

2.ISP强调的是接口对客户端的承诺越少越好,并且要做到专一。

3.接口污染:过于臃肿的接口设计是对接口的污染。就是为接口添加不必要的职责,如果 开发人员在接口中增加一个新功能的主要目的只是减少接口实现类的数目,则此设计将导致接口被不断地“污染”并“变胖”。“接口隔离”其实就是定制化服务设计的原则。

处理方法:

①利用委托分离接口

②利用多继承分离接口

C.开放-封闭原则:

1.定义:

open:模块的行为必须是开放的、支持扩展的,而不是僵化的

closed:在对模块的功能进行扩展时,不应该影响或大规模地影响已有的程序模块

2.也就是要求开发人员在不修改系统中现有功能代码的前提下,实现对应用系统的软件功能的扩展;一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的

3.如何遵守开放-封闭原则:核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,这样的修改就是封闭的;而通过面向对象的继承和多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。

①在设计方面充分应用“抽象”和“封装”的思想

②在系统功能编程实现方面应用面向接口的编程

D.替换原则(LSP,里氏替换原则):子类必须能够替换成它们的基类

1.定义:子类型必须能够替换掉它们 的父类型、并出现在父类能够出现的任何地方。一个软件裸体如果使用一个基类的话,那么一定适用于其子类,而这根本不能察觉出基类对象和子类对象的区别。

2.如何遵守:

①父类的方法都要在子类中实现或者重写,并且派生类只实现其抽象类中声明的方法,而不应该给出多余的方法定义或实现

②在客户端程序 中只应该使用父类对象而不应当直接使用子类对象,这样可以实现运行期绑定

3.PHP对LSP的支持并不友好,缺乏向上转型等概念,只能通过一些曲折的方法实现。

E.依赖倒置原则:就是将依赖关系倒置为依赖接口

1.定义:

①上层模块不应该依赖于下层模块,它们共同依赖于一个抽象

②抽象不能依赖于具体,具体应该要依赖于抽象

2.抽象一般是相对稳定或者相对变化不频繁的,而具体是易变的。

3.IOC是依赖倒置原则的同义词,依赖注入(DI)和依赖查找(DS)是IOC的两种实现。

4.PHP还没有一个完善的IOC容器,或者说PHP不需要

5.如何满足IOC:

每个罗高层次类都为它所需要的服务提出一个接口声明,较低层次类实现这个接口

每个较高层类都通过该抽象接口使用服务

F.一些优于面向过程的

1.新成员的加入和融合不再困难

2.代码即文档

3.我们既要深入了解面向对象的思想,又不能执着于面向对象

https://github.com/zhangyue0503/php/blob/master/phphexinjishuyuzuijiashijian/2.php

三、正则表达式基础与应用

A.认识正则表达式

1.PHP中有两套正则函数:

①由PCRE库提供的函数,以“preg_”为前辍名

②由POSIX扩展提供的函数,以“ereg_”为前辍名,PHP5.3后不推荐使用

2.在PHP里,一个正则表达式分为三个部分:分隔符、表达式和修饰符

四、PHP网络技术及应用

A.HTTP协议详解

1.HTTP就是一个基于应用层的通信规范:从WWW服务器传输超文本到本地浏览器,由请求和响应构成。是一个无状态的协议,同一个客户端的这次请求和上次请求没有对应关系。属于典型的问答式交互。

2.SPDY协议,优化了浏览器和服务器之间的通信,支持流复用,具备优先级的请求、主动发起请求、强制SSL安全传输等先进特性。

3.HTTP工作流程:

①客户机与服务器建立连接

②建立连接后,客户机发送一个请求给服务器。格式为:前面是统一资源标识符(URL)、中间是协议版本号,后边是MIME信息(包括请求修饰符、客户机信息和可能的内容)

③服务器接到请求后,给予相应的响应信息。格式为:首先是一个状态行(包括信息的协议版本号、一个成功或错误的代码),然后是MIME信息(包括服务器信息、实体信息和可能的内容)

④客户端接收服务器返回的信息并显示 在用户的显示屏上,然后客户机与服务器断开连接

4.垃圾信息防御措施

①IP 限制

②验证码

③Token和表单欺骗

④审核机制

B.抓包工具:Fiddler

C.Socket进程通信机制及应用

1.Scoket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通过套接字向网络发出请求或者应答网络请求。Socket既不是一个程序,也不是一种协议,其只是操作系统提供的通信层的一组抽象API。

2.PHP的语言特性和自身定位决定了它只适合做客户端

3.注意:

①fsockopen的第一个参数$hostname不要带“http://”,除非使用SSL等

②Headers请求不一定都要按照抓包数据全部带上,除非调用不成功或者不熟练或者有特殊需求

③在Connection和data后有两个换行

④有些表单请求可能有hidden值

⑤注意编码问题

D.cURL工具及应用

1.建立cURL请求的基本步骤

①初始化

②设置选项,包括URL

③执行并获取 HTML文档内容

④释放cURL句柄

2.curl_getinfo()对调试很有用

E.简单邮件传输协议SMTP

1.SMTP是由源地址到目的地址传送邮件的一组规则,用来控制信件的中转方式。

F.WebService的前世今生

1.WebService

2.PHPRPC协议

G.Cookie详解

1.Cookie在远程浏览器存储数据并以此跟踪和识别用户的机制。从实现上说,Cookie是存储在客户端上的一小段数据 ,浏览器(既客户端)通过HTTP协议和服务器端进行Cookie交互。

2.使用PHP设置Cookie其实就是发出命令让浏览器来设计Cookie而已

3.注意:

①cookie函数有一个返回值,如果是false,代表设置失败,但是仅供参考

②由php在当前页设置的cookie不能立即生效,要下一个页面才能看到

③cookie没有显式的删除函数

4.cookie跨域需要P3P设置

①页面的cookie不能是浏览器进程的cookie

②利用iframe时,要在相应的动态页的页头添加一下p3p的信息

③ie对跨域访问cookie限制比较严格

5.本地localStorage存储

H.Session详解

1.session_set_save_handler()改变session存储的方式

2.sessionid默认作为一个cookie存储在客户端

https://github.com/zhangyue0503/php/blob/master/phphexinjishuyuzuijiashijian/3.php

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

原文发表时间:2019-05-27

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

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券