一、高级PHP技巧
A.多维数组
1.自定义排序
B.高级函数定义
1.递归函数:函数自己调用自己的行为;递归需要一个退出语句;需要注意资源消耗;
2.静态变量让函数在多次被调用时记住变量的值,而这些变量并不是全局变量。可以在递归时统计计数。
3.匿名函数:好处有函数的定义及其隐式调用结合得更紧密;直接使用PHP只需要维护匿名函数的定义就好了;副作用是有可能出现解析错误;
C.原型文档语法(heretic)
1.<< 2.要注意起始分界符(EOT)之后就是回车而终止分界符必须在一行的开始 3.newdoc不会解析变量 D.使用printf()和sprint() https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/1.php https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/1-1.php https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/1-2.php https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/1-3.php 二、开发Web应用程序 A.模块化一个Web网站 1.配置文件的作用:定义常量、建立站点范围内的设置、创建用户自定义函数、管理错误 2.索引文件:是模块化程序中的主要脚本,事实上它是唯一会被加载进Web浏览器的页面,这种构建方法的技术术语叫做引导文件(bootstrap file),通常也是在基于框架的网站系统中的通常方式。包含配置文件、包含数据库链接文件、合并HTML模板、判断并包含适当的内容模块。 B.调整浏览器缓存 1.利用header设置四种缓存:Last-Modified(最后修改时间)、Expires(过期时间)、Pragma(编译提示)、Cache-Control(缓存控制) https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/2/ 三、高级数据库概念 A.在数据中缓存会话 1.session_set_save_handler()指定处理session的方法 B.处理美国的邮政编码 https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/3/ 四、面向对象编程基础知识 A.面向对象编程的理论 1.模块化:把应用程序拆分为明确的子部分 2.抽象:类的定义应该很宽泛 3.封装:分隔和隐藏工作的完成方式 4.对象的使用效率比使用面向过程编程的方法要低,对象的误用和滥用 五、高级面向对象编程技术 A.继承 1.当一个类从另外一个类继承时,子类总是应该对一个事物有更加特定化的描述。在决定方法所在的位置时,包括构造函数和析构函数在内,我们需要考虑这个功能是通用的还是专用的 B.重写 1.final方法不能被重写 2.如果重写方法时使用了不同数量的参数,这种技术叫做重载 C.访问控制 1.封装:就是将不需要在类外可见的信息隐藏起来(真实的数据或过程)。 2.一个好的类是个有用的实体,而不需要我们知道其内部的实现细节 ,应该在很多时候有些内部的数据是不应该被允许从外部访问的。 3.所有的属性都应该为受保护的或者私有的,在有需求的时候,使用“set”和“get”方法作为访问它们的接口 D.使用范围解析操作符 1.使用::在类中(而不是对象)访问成员。self、parent等 2.可能在两个地方被调用 在使用类的时候,在父类和子类具有相同名称的属性和方法时,利用它可以避免混淆 在类外的时候,在没有创建对象的情况下使用该操作符访问类的成员 3.多数情况下,使用范围解析操作符是为了访问被重写的方法,也可以访问静态和常数成员 E.静态成员 1.一个静态函数变量能够在每次被调用的时候记住其值,类中可以在所有实例之间记住其值(根据类来访问所有的对象) 2.静态属性和标准属性的区别是我们不能在类里面使用$this访问他们而应该使用self::$xxx来访问 3.静态方法几乎都是公开的,因为它们不能通过对象实现访问,静态属性和静态方法有时候也被叫做类属性和类方法 https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/5/ https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/5.php 六、再谈高级面向对象编程 A.抽象类和方法 1.抽象类是父类的模板。通过定义一个抽象类,我们可以指明类的一般行为。换句话说一个抽象类定义了接口:这个基类的继承类如何被使用。然后子类会负责定义这些接口的真正的实现。 2.扩展类里实现抽象方法的时候,其可见性必须高于或等于抽象方法定义的可见性。 3.如果一个类哪怕只有一个抽象方法,那么这个类本身也应该是抽象类。 B.接口 1.接口,如抽象类一样,定义必须被特定类定义的功能接口(也就是方法)。要创建接口,需要使用interface关键字。 2.接口中所有的方法都必须是公开的。同时,接口只是定义了方法,但是没有包括属性。 3.和抽象类的区别: 一个抽象类意味着会被扩展为一个特定的类,我们将使用扩展类来创建一个对象实例。 一个接口不能被一个类继承,所以我们不能认为一个接口是定义一个完事的对象的松散方式。取而代之,一个接口建立一个类需要具有方法的合约,而不去关心类的类型。 抽象类和它的继承类之间是“是一个”(is a)的关系,接口和它的继承类之间是一个“有相同的行为”的关系 4.一个接口解释了一个类或者方法是如何被使用的,接口可以指一个类需要绑定的合约 C.traits 1.traits允许我们在不使用继承的情况下为一个类增加功能 2.与接口的区别: 一个接口会强制执行更严格的编程规则,以便类被设计为实现特定的方法 一个trait使方法对一个类可用,即使它没有在类中定义 3.如果方法有重名,假如是类中自己定义的,类中的优先级高;假如是类通过其他继承来的,则traits的优先级更高 D.类型提示 1.类型提示(Type Hinting)是用于指示期待什么类型的数据的编程行为。 2.继承本身并不是面向对象的核心,最核心的概念是重用。继承只是代码重用的一种方式,另一种就是组合。 E.命名空间 1.命名空间通过使我们按照组来管理我们的代码以解决冲突的问题。这样就可以达到使我们使用更有意义的名字而不用去关心冲突的问题的效果。 2.命名空间只放置:类、接口、函数、变量 https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/6/ 七、设计模式 A.理解设计模式 1.设计模式并不是一段可以供我们根据需要复制和粘贴的代码。设计模式是一些编程方式,这里的特定的代码,其实是这种编程方式的实现,它有可能会根据场景的不同而有所改变。 2.设计模式包含: 它的名字 一个关于问题的讨论:在什么场景下我们应该使用这种特定的设计模式 解决方式,它并不是具体的实现代码,而是提供足够的信息,以便于我们可以根据这些信息来实现这种解决方式 结论:关于这种特定的设计模式的优点和缺点 3.设计模式并不是解决任何问题的万能药 https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/7/ 八、使用既有的类 A.捕获异常 1.异常处理比条件判断好的一点在于,它进一步地将程序的功能和逻辑与错误处理分离开来,多重错误可以无须使用多层嵌套的条件语句就能得到处理。 B.PDO 1.如果通过exec()方法执行的查询没有影响任意一行数据,该方法会返回0。而当查询出错时,该方法会返回false。 C.PHP标准库(SPL) 1.PHP5.4新增组件为SessionHandlerInterface接口,用于处理会话 2.使用SPL异常类而非自定义的Exception类的扩展 3.SplStack()栈、SplQueue队列 https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/8/ 九、面向对象编程实践:CMS系统示例 1.HTML_QuickForm2,表单验证工具 https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/9/ 十、PHP网络编程 A.访问其他网站 1.fopen($url,’r')可以直接访问其他网站信息 2.需要设置allow_url_fopen B.PHP socket编程 1.fsockopen C.使用IP进行地址查询 1.gethostbyname()返回指定域名的ip地址 2.gethostbyaddr()获得ip地址对应的域名 D.使用cURL E.创建Web服务 1.复杂的Web服务:可能使用网络服务描述语言(Web Services Description Language,WSDL)来描述提供的服务,可能会需要使用像SOAP(Simple Object Access Protocol)这样的协议,不仅可以传输普通文本或者XML,服务器还可以使用约定好的对象格式回传数据 2.简单的Web服务:无状态的,只有简单的请求—响应动作,流行的简单服务称为REST-ful,表征状态转移协议(Representational State Transfer,REST) https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/10/ 十一、PHP与服务器 A.文件压缩 gzopen()、gzwrite()、gzclose()、readgzfile()、gzfile() B.使用Mcrypt 1.MCrypy库加密数据 https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/11/ 十二、PHP的命令行界面 php -a:交互式命令行 $_SERVER[‘arg']参数数量,脚本本身名称是第一个参数 $_SERVER[‘argv’]参数数组,脚本本身名称是第一个参数 fgets(STDIN)读取输入 php -S localhost:8000启动服务器 https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/12/ 十三、XML和PHP https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/13/ 十四、PHP程序调试、测试与性能 A.调试工具 1.常见的PHP调试工具:PHP高级调试器(Advanced PHP Debugger,APD)、DBG、Xdebug 2.xdebug安装使用 B.单元测试 1.好处:将bug数量降到最低、帮助提高软件设计、协助代码文档的编写、减小在需要必定代码时破坏代码并引入错误的可能 2.理论要求: 要容易编写、阅读和执行 要尽可能原子仳(即尽量精确并简短) 用来检查代码是否按照预期的方式运行 不可用于检查用户输入 不可用于处理那些在网站实际 运行中可能会出现的问题 3.TDD(测试驱动开发)的好处: 不需要最后编写测试以适应代码 编程有目标可循,尤其是需要哪些特性,哪些不做要求 可以须知何时编码完成,因为要通过所有的测试 可以养活遭遇“码工困境”的可能,因为总是知道接下来的编码内容 与“极限编程”的概念相关 4.单元测试是用断言(assertion)来定义的。简单来说就是:确认是这种情况。断言是单元测试的核心:应该是什么就必须是什么。每一个测试应该断言一个特定的方面。 C.脚本分析 1.使用webgrind配合xdebug D.提高性能 1.低效的标识 那些比其他过程花费了更多时间的过程 那些占用了比其应该占用的时间更多的过程 2.一般来说比较费时的操作: 输入输出:文件操作、数据库交互、网络操作(与其他服务器交流)、与本服务器进行交互(包括文件、数据库操作、发送邮件、调用其他工具等等) 用户定义的函数:查看函数调用计数,某个函数被调用多少次 循环或者处理大数据集 3.要确保在做优化改进时不要引入新的bug https://github.com/zhangyue0503/php/blob/master/shenrulijiephp/14/