一、面向对象
A.类
1.类是简单的用户定义类型。在面向对象的语言中,类就是创建类的对象或实例(功能副本)的模板;类描述了其所属的任何对象的共同特点;类的目的是封装对象的定义和行为,对最终用户隐藏它的具体实现,并使最每次用户按照文档说明和期望的方式来使用类对象。
2.类是自足的,它就像一个可以控制入口的高速公路—有受限的入口和出口坡道。
B.继承和重载
1.方法定义为final就不能被重载
2.使用__autoload可以自动加载类文件,类文件中不要?>结尾
C.各种“魔术方法”
1.__set,赋值给不存在的成员时调用,__get调用不存在的成员时调用,__isset检验一个不存在的属性是否设置或是否有值,__unset在一个不存在的属性上调用unset时调用,empty会调用__isset;
2.__call调用不存在的方法时,此函数被调用
D.复制、克隆和比较对象
1.普通=是浅复制,深复制使用clone
2.比较:同一类对象所有成员是相等的,使用==;对象是同一类相同对象的引用,使用===;
E.接口、迭代器和抽象类
1.实现接口Iterator的任何类都可以在for循环中使用,它们的对象被称为迭代器,迭代器是可以像数组一样表现的对象
2.接口和抽象类:两者均被
F.类的作用域与静态成员
1.在类作用域内声明的静态对象与其可见性无关。self就是“这个类”的缩写,不会通过继承传递。
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/1.php
二、异常和引用
异常是同步事件。“同步”的意思是指代码本身对事件做出瓜,而不是像信号一样,对外部事件做出反应。
A.异常
1.异常可以是Exception类的对象,也可以是任何扩展了Exception类的对象。
2.set_exception_handler建立倒休捕获异常的处理程序
3.除非try块也被嵌套,否则PHP不会支持嵌套异常
B.引用
1.PHP中引用不是指针,与Perl不同,PHP没有引用类型,不能利用引用对象的方式来存储对象的地址。“引用”仅是指一个对象的另外一种称呼。
2.PHP实际上是通过复制对象传递参数的,对于非对象类型(如数字、字符串或数组)来说,创建了一个完全相同的对象实例。对于对象类型来说,却只创建了引用或对象的另一个名称。通过操纵新的变量,我们就可以操纵原来对象的内容,因为新的变量仅是现有对象的另一个名称。
3.引用可以绕过private或protected提供的可见性保护
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/2.php
三、PHP在移动设备上的应用
A.检测设备
1.$_SERVER[‘HTTP_USER_AGENT’],可能带有欺骗性
2.browscap.ini
B.侦测移动性能
1.WURFL系统
2.Tera-WURFL:使用数据库而不是很大的XML
C.渲染工具
1.WALL
2.图像调整:ImageAdapter
3.响应性CSS:@media相关属性
D.模拟器和SDK
直接去找手机模拟器下载
E.QR码
TCPDF、PHPQRCODE、Google Chart API
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/3.php
四、PHP在社交媒体中的应用
A.OAuth
认证步骤:
①OAuth应用向服务提供商发送消费令牌,替换掉请求令牌
②提示用户权限并授权
③使用回调URL或者个人标识号(PIN)来验证授权的请求
④交换请求令牌和PIN(或者回调)来获取访问令牌
⑤用户通过访问令牌来使用应用
B.Twitter和Facebook,访问外国网站啊,心累
五、前沿
A.命名空间
1.命名空间是一系列语法对象,可包含类、函数或者常量。它们按等级排序并可能包含子命名空间。用于解决变量名称冲突,PHP5.3引入。
B. 匿名函数(闭包)
在PHP中,闭包主要用来创建简短的回调函数,以及防止不必要的全局名称带来的浪费。
C.Nowdoc
1.Nowdoc插入SQL、PHP代码和动态可执行变得非常容易。需要在脚本中插入代码作为字符串时,Nowdoc仅仅是作为辅助。
D.局部goto语句
1.不能跳出例程或者进入循环
E.标准PHP库
1.标准PHP库(SPL)是一套类,对于标准程序结构,比如栈、堆、双端链表和优先级队列极为有用。
2.SplMaxHeap、SplFileInfo、FilesystemIterator、Globiterator
3.PHP5.3开始成为PHP的组成部分,不能禁用或卸载,是一个相当大并且在发展的扩展。
F.Phar扩展
1.php.ini中phar.readonly必须为Off
2.phar pack -f xxxx.phar -c gz xxx.php xxx.php
3.phar sign -f xxxx.phar -h sha1签名防止修改
4.phar list -f xxxx.phar查看内容
5.phar delete -f xxxx.phar -e xxx.php 删除一个php文件
6.phar add -f xxxx.phar xxx.php添加一个php文件
7.phar命令支持正则
8.phar stub-set -f xxxx.phar -s stub.php 创建可执行脚本,脚本结束必须有__HALT_COMPILER();
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/4.php
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/4-1.php
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/wild.php
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/domestic.php
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/stub.php
六、表单设计与管理
A.数据验证
1.filter_var函数
2.PCRE库
B.上传文件/图片
1.is_uploaded_file
C.图像转换和缩略图
1.imagecreatetruecolor创建缩略图,imagecopyresampled创建图像副本,imagedestroy销毁资源
D.正则表达式
1.JS中:String.match;String.search();String.replace();String.split();Regexp.compile();Regexp.exec();Regexp.test();
2.PHP中:preg_grep();preg_match_all();preg_match();preg_replace_callback();preg_replace();preg_split();
E.多语言集成
1.HTML中:<meta http-equiv=“Content-Type” content=“text/html;charset=UTF-8”/>
2.MySQL:set names utf8
3.PHP:utf8_encode();mb_convert_encoding();mb函数;iconv()
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/5.php
七、数据库集成Ⅰ
1.创建NoSQL数据库有两个目的:原始性能和可扩展性;低管理开销;
2.通常在单个集合里搜索非常快,只不过没有连接。map-reduce算法有效划分了数据库,使其分别在多台不同机器上工作。
3.ACID要求:
A.MongoDB
1.如果没有一个safe参数用以插入调用,唯一索引不会报错,可能造成性能损失。
2.运算符包括$gt,$lt,$lte,$gte,$ne,$in,$nin,$extists
3.使用正则表达式查询:MongoRegex
4.$where语法使用js语法
B.SQLite
1.支持的数据类型:NULL、整数、实数、文本、二进制大型对象
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/7.php
八、数据库集成Ⅱ
A.PDO
1.PDO两个层次:有一个能用的PDO接口;特定数据库的驱动程序;
B.Sphinx
九、数据库集成Ⅲ
Oracle
十、函数库
SimplePie(订阅RSS)、TCPDF(PDF生成)、phpQuery(HTML DOM)、PHPMailer(php发送邮件)、gChartPHP(Google图表API包)
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/10.php
十一、安全
A.永不信任数据
1.register_globals:初始化变量,确保register_globals不能覆盖已有的变量
2.对于include和require调用中的变量,应该使用可接受文件名的白名单或者净化文件名,尽量不要使用$_GET之类的来获取加载
3.表单数据应该使用https
4.不要信任cookie、session和server
5.ajax的标头可能被伪造
B.常见的攻击
1.同源策略:是浏览器针对客户端的脚本实施的一项安全措施。使脚本只能够访问在同一协议、主机和端口上的函数以及元素。一些攻击的发生是因为利用用户或者网站而不合理地绕开了同源策略。
2.跨站脚本攻击(XSS):将JS脚本注入到网页中,利用cookie等向目标服务器发送数据。必须转义htmlspecialchars或filter_var来处理输入的值
3.跨站请求伪造(CSRF):利用伪造的HTTP请求。预防技巧是生成传话ID时,产生并存储一个秘密的会话标记,在提交时进行匹配并确保一定的时间内有效。
C.会话
1.使用XSS将SID写一篇用户的cookie中。必须在每个脚本开始重新生成会话并在php.ini中设置指令,在PHP中可以使用新的值替换传话ID,但保留当前传话的数据。也可以保存一些$_SERVER信息的值进行比对,最后就是加密服务器端的会话数据。
D.预防SQL注入
尽量使用PDO占位符,msqy_sql_real_escape_string函数以及addslashes函数
F.过滤器扩展
使用filter_var函数
G.php.ini和服务器设置
1.生产环境不要显示phpinfo(),合理的目录读写权限,.htaccess和robots.txt可能暴露第三数据
2.php.ini中不显示错误,确保日志文件位于文档目录之外,关闭register_globals、magic_quotes_gpc,注意disable_classes中的高风险PHP函数,open_basedir限制php能打开文件的目录
H.密码算法
1.掺杂包含为散列结果追加字符串然后重新散列联结后的结果。(salt)
十二、使用Zend Studio for Eclipse、Bugzilla、Mylyn和Subversion进行敏捷开发
十三、重构、单元测试和持续集成
A.重构
B.单元测试
1.最好让一个类代表一个对象,一个函数只做一件事
2.即使代码覆盖率达到100%,程序仍可能运行失败,因为程序是一个整体,要测试整个程序需要进行功能性测试
3.单元测试有助于提醒程序内发生的变化,已知变化或一些重构带来的副作用。单元测试和功能性测试都属于回归测试,确保一个功能优化处理、BUG修正或配置变更后,没有引入新的错误或者倒退。
4.测试驱动开发的基本原则:编写一个测试;由于尚未编写出可以满足测试的代码,测试失败;实现最少的功能,使测试通过;重复上面的步骤;
C.持续集成(CI)
1.一个包含多步骤的任务示例:从受控的源代码库要付出当前版本的代码;从网站上抓取第三方库的最新版本;对程序做表态分析;在程序中,对PHP代码进行单元测试;
2.假设发布一个新版本,基于单元测试成功,可以设置额外的构建步骤:
3.Jenkins和phpUnderControl
4.CI服务器使用以下工具:版本控制;单元测试和代码覆盖;静态分析;自动构建;
5.静态分析:检测代码包括计算复杂度、依赖性、最佳实践建议、编程规范的符合度、找出问题的代码或者可能的缺陷;显示重复的代码;产生文档;相关工具:PhpCheckstyle、PHPCodeSniffer(编程规范的符合);PHPDocumentor(API生成);PHPLinesofCode、pdepend(代码质量的度量);PHP Copy/Paste Detector、phpmdPHPmessdetector、phantrn、padawan(代码质量建议);phpcb(代码加亮);PHPSecurityAuditTool(安全)
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/walk.php
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/walkTest.php
十四、XML
https://github.com/zhangyue0503/php/blob/master/phpbianchengshizhan/14.php
十五、JSON和Ajax
十六、结束语