========================第一章============================
Apache 源码
PHP解释器源码
========================第二章============================
基本数据类型 整型、浮点型、字符串、布尔值
复合数据类型 数组、对象
特殊类型 资源、NULL (例如,数据库就是资源)
函数名和类名不区分大小写
一个没有设置值的变量,其行为如同NULL值
变量的变量 $foo = 'bar' ; $$foo = 'baz'; => $bar = 'baz';
变量引用 $black = &$white; 当$white被unset时,$black的值仍然为原$white的值
垃圾回收 使用引用计数和写时复制,当$A变量被赋值给$B变量时,仅仅是$A的值的内存区域的引用增加了1,当$B变量的值的内容发生变化时,将$A值的内存区域进行复制,再修改$B的内存区域。$B=$A (未分配内存) $B[1] = '2' (复制内存,并更改)
垃圾回收 当内存的引用为0(用户角度为0,C的实现中为1),将占用内存释放
隐式类型转换 字符串与整形操作转化为整形或浮点型(如果字符串存的是浮点型),字符串与浮点型操作转换为浮点型
隐式类型转换 如果字符串开头没有字母则将字符串看为0,如果字符串开头有.eE字符,则解析为浮点数
+(3-4) 算术断言
逻辑运算符 && = and , || = or , xor , !
`...` 表示执行shell命令,如$list = `ls -l`
declare 滴答指令,通过register_tick_function()注册,declare(ticks = 3)表示每三次,执行一次register_tick_function中注册的函数
exit()是die()的别名
包含代码 require和include引入文件时,通过PHP的配置文件php.ini启用了allow_url_fopen选项,则可以通过提供一个URL代替本地路径包含来自远程站点的文件
从远程获取以.php结尾的文件也就是从一个启用了PHP的Web服务器取回PHP脚本的输出,因为这个原因,推荐使用.inc作为主要包含代码的库文件,并用.html作为主要包含HTML的库文件
get_included_files()函数用来获取脚本中用include和require包含的文件,返回一个所以已包含的文件名的数组
========================第三章============================
嵌套函数声明 嵌套声明不限制内部定义函数的可见性,这样就可以在程序的任何地方调用函数。内部函数不能自动获得外部函数的参数。直到外部函数被调用时才能调用内部函数
变量作用域 函数内不能访问函数外变量,函数外也不能访问函数内变量。函数内可以使用global关键字或$_GLOBALS[""]访问
静态变量 static
函数参数传递 值传递和引用传递,PHP中值传递必须复制该值,引用传递不必
默认参数
可变参数 可以不在函数声明中确定参数个数,而是使用func_get_args、func_get_arg、func_num_args来获取参数和个数
func_num_args 是可以作为参数直接传递其他函数的
function &fun(){} $x = &fun(); 返回返回值的引用,可以有效地从一个函数返回大型字符串或数组值
可变函数 $fun()即变量加(),可以先使用function_exists($functionname)进行判断,如echo、isset等无法使用变量调用
匿名函数 使用create_function(args_string, code_string)进行创建
========================第四章============================
字符串 一般情况下使用单引号,有转义变量时使用双引号,跨越多行时,使用
heredoc格式
heredoc格式 $str = <<<ABC xxxxxxxx ABC; ABC为任意标识符,单双引号将直
接被输出
复杂方式变量替换 使用大括号,echo "You are the {$n}th." 将打印$n的值,
如果没有大括号将打印$nth的值
错误的转义字符 如果转义字符未定义,如\c,此转义字符将直接被打印,或如果
警告级设置为E_NOTICE,则产生一个警告
echo 语言结构
print 为函数
printf 为函数,类似C语言的printf,使用%输出,如printf("%d",27);
sprintf 为函数,与printf的不同是sprintf返回字符串,而不是输出
print_r 智能输出,之前的方式只能输出字符串,print_r可以输出数组等
var_dump 更详细,当使用print_r和var_dump访问递归结构时,可能出现问题
trim ltrim rtrim 删除空白符或指定字符
ucfirst ucwords strtolower strtoupper 改变大小写
htmlentities htmlspecialchars 转义为HTML字符串,一些符号被转义如空格转义为"
get_meta_tags 提取元标签
rawurlencode rawurldecode urlencode urldecode URL
addslashes stripslashes SQL
==和=== 在字符串比较时都比较内容,但字符串与其他类型比较时,===会返回
false,但"3" == 3 为true
字符串近似比较 soundex、metaphone、similar_text、levenshtein
正则表达式 ereg()进行POSIX匹配,preg_match()进行Perl匹配
POSIX匹配易读,Perl匹配更快
POSIX字符类扩展
锚 限定字符串中的一个特定位置
量词与贪心 Perl默认是贪心的,即尽可能多的匹配,可以使用?(问号)来尽可能少的匹配
非捕获组 ?:subpattern
后引用 先前捕获的文本 \1表示查阅第一个子模式的内容,\2表示第二个
内部选项 (?flags:subpattern)
前瞻和后顾 (?=subpattern) 正前瞻 (?!subpattern)负前瞻 (?<=subpattern)正后顾 (?<!subpattern)负后顾
关于正则表达式的详细内容,还需要复习并做相应的练习
========================第五章============================
如果初始索引是一个非数字字符串,那么后面的索引是从0开始的整数
在数组的末尾添加值 $family = array('Fred','Wilma'); $family[] = 'Pebbles';
foreach结构不在数组自身上操作,而是在它的一个拷贝上操作。可以在foreach循环体内插入或删除元素,这样并不会影响数组本身
========================第六章============================
用变量提供一个类名 $Class = 'Person'; $object = new $Class; $object = new Person;
对象的引用与赋值 当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。可以用克隆给一个已创建的对象建立一个新实例。当使用对象引用时,引用的变量相当于该对象变量的别名。对对象变量赋null时,不会影响对象本事,但引用变量也会变成null
<?php
class Instance{
function __construct(){}
}
$instance = new Instance();
$assigned = $instance;
$reference =& $instance;
$ref =& $assigned;
$assigned->var = '$assigned will have this value';
//$instance = null; // $instance and $reference become null
$assigned = null;
var_dump($instance);
var_dump($assigned);
var_dump($reference);
var_dump($ref);
?>
在反串行化之前,一个对象的类必须被定义。试图对一个没有定义类的对象进行反串行化将会使该对象被置于stdClass,从而使该对象失去作用
========================第七章============================
表单验证 可以使用javascript和php服务端同时验证
设置响应头 header()用来设置响应头,但必须在文档的开头,否则会出现警告
会话跟踪方法 1.使用隐藏的表单字段传递 2.为每个用户分配一个惟一标识符,并且通过一个隐藏表单字段传送ID 3.URL重写 4.使用cookie,setcookie()
使用session session_start() session_register() session_unregister() session_id() session_destory() ...
php.ini中register_globals 这个关键字在5.4以后已经不再使用了,之前的含义是当其值为On是,如果用户通过URL传入一个变量,可能对服务器造成破坏,如php文件中if(check_user_privilege()){ $user_level = 1;},当用户传入的URL为url?user_level=1且register_globals=On时,用户级别的验证就失效了
========================第八章============================
占位符 PEAR DB的三种占位符,?字符串或数字,|一个从不被引起来的字符串或数字,&文件名,如$db->query("insert into movies (title,year) values (?,?)", $movie);
========================第八章============================
数据库
========================第九章============================
GD库
========================第十章============================
PDF扩展
========================第十一章===========================
XML解析
Web服务 为基于XML和HTTP的远程过程调用提供一种标准的机制,从而省去建立各种新协议的需求
Web服务的标准协议 XML-RPC、SOAP、JSON-RPC、REST
========================第十二章===========================
全局变量和表单数据
初始化变量
设置variables_order
文件名 远程文件
相对路径检查 ../../etc/passwd
限制对特定目录的文件系统访问
上传文件 不信任浏览器提供的文件名
上传文件 小心文件系统被填满
上传文件 使register_globals续存
文件权限 在第一次使用时确定权限,会话文件
安全模式
隐藏PHP库
eval()和preg_replace /e的使用
shell命令
========================第十三章===========================
Smarty模板系统
异常级别 提示(notice)、警告(warming)、错误(error)
解析错误 在脚本语法不正确时引发的一类特定错误
所有除解析错误之外的错误都是运行时错误
错误禁止 @
错误触发
性能调整 先运行起来,在对慢速代码进行调整;优化两个方面:缩短执行时间和减少内存开销
性能监测 计算出页面中各个子例程或逻辑单元所耗费的时间
“如果产生一个页面需要5秒钟,你绝对不可能通过优化一个耗时0.25秒的函数来让页面的总时间减至2秒”
速度会存在绝对极限,如果需要继续提高速度,需要使用更好的硬件或带有反向代理缓存的Web服务器
当echo可以满足需要时避免使用printf()
避免重复计算循环内的值
尽量减少包含无用的文件和代码块
使用数据库时,最好使用数据库持久连接
当简单字符串可以满足需求时,不要使用正则表达式
优化内存开销 尽可能使用数值代替字符串
当处理完一个大字符串时,将字符串变量置空,这样可以释放内存以便重新利用
仅包含和请求实际需要的文件,并使用include_once和require_once代替include和require
解决传输瓶颈的通用解决方案 反向代理缓存、负载均衡服务器和数据库复制
MySQL复制 使用主从数据库
========================第十四章===========================
PHP扩展 C扩展库:PHP扩展、Zend扩展
以下显示了一个链接有PHP的Web服务器框图
可以登录http://svn.php.net/viewvc/下载php的源码,做一些扩展工作
开发扩展的一般步骤:
1. 创建扩展 可以使用PHP命令行代替Web调试
使用ext_skel工具创建扩展,将自动创建如下文件:
config.m4 配置规则
CERDITS 保存扩展名称和作者名称
EXPERIMENTAL 指示扩展仍然是实验性的
xxx.c 扩展的实际C代码
xxx.php 测试脚本
Makefile.ini makefile模板
php_xxx.h 扩展的C头文件
tests/ 用于回归测试的目录
2.充实框架
xxx.c中function_entry数组列出了扩展实现的所有用户可见的函数
MINFO()由phpinfo()调用,并在phpinfo()的输出中加入关于扩展的信息
3. 编译扩展
编辑config.m4,扩展方式有两种,编译成一个共享模块或将扩展直接放入PHP的源代码树框架中
共享模块方式可以更快地编译,但必须在程序源代码或者php.ini文件中显式载入它
内存管理
zval/pval
PDF文档下载地址:http://download.youkuaiyun.com/download/expleeve/4307064