概述
《细说PHP》——电子工业出版社
第一章 lamp网站构建
Web应用的部分优势:
基于浏览器,具有统一的平台和UI体验。
无需安装,拥有浏览器即可体验。
总是使用应用的当前最新版本,无需升级。
数据持久存储在云端,基本无需担心丢失。
Web2.0主要特点:
用户参与网站内容制造。
Web2.0更注重交互性。
符合Web标准的网站设计。
Web2.0和Web1.0之间没有绝对的界限。
Web2.0的核心不是技术,而在于指导思想。
HTTP协议:
默认端口是TCP80。
请求工作过程分为4步:1.建立连接;2.发出请求信息;3.接收响应信息;4.关闭连接。
HTTP消息类型:1.请求消息;2.响应消息。
HTTP消息内容:1.请求/响应行;2.请求/响应头;3.请求/响应体。
常用Web服务器:
Apache、NGINX、IIS、Tomcat、Weblogic
常见网站服务平台:
ASP.NET、JavaEE、LAMP
PHP能够做什么:
服务端脚本、命令行脚本、编写桌面应用程序
PHP的特性:
可运行在所有主流操作系统之上。
支持很大范围的数据库。
支持利用诸如LDAP、SNMP、IMAP、POP3等协议服务。
第6章 PHP的基本语法
可变变量:
变量引用赋值:$hi = "hello"; $$hi = "world"; echo "$hi $hello"; // 输出hello world,$$hi = $hello
注意:PHP引用不像C语言的地址指针,$bar和$foo在内存上不同体,只是把各自的值相关联起来,参考下面例子。$foo = "BOB"; $bar = &$foo; $bar = "My name is Tom"; echo $bar; // 输出My name is Tom echo $foo; // 输出My name is Tom
变量命名:$foo = 25; $bar = &$foo; unset($bar); echo $foo; // 输出25
区分大小写、以字母或下划线开头(不能以数字)、不能存在空格、中文是允许的、可以使用关键字做变量名(只是容易混淆)
变量类型:
PHP是弱类型检查语言,变量或常量的数据类型由程序的上下文决定。
数据类型:4种标量(boolean、integer、float、string)、2种复合(array、object)、2种特殊类型(resource、NULL)
布尔型:
0、0.0、空白字符串、字符串“0”、没有成员变量的数组、没有单元的对象(PHP4)、特殊类型NULL、尚未设定的变量均为FALSE
整形:
八进制:0123(十进制的83)、十六进制:0x1A(十进制的26)
浮点型:
精确到小数点后15位
不要比较两个浮点数是否相等,因为用浮点数表示8,其内部表示是7.99999999999……
字符串:
定义简单字符串的时候,单引号的效率更高(不解析变量$str,不转义除'外的转移字符)
双引号中转义n,t等字符,变量名会被变量值替代
定界符的使用:
echo <<<EOT 这里是包含在定界符内的字符串 EOT;
资源类型:
通过专门的函数来建立和使用,使用资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,由程序员创建、使用和释放。
NULL类型:
值唯一,只有NULL
不区分大小写
变量尚未被赋值、unset函数销毁的变量的值为NULL
伪类型:
mixed——多种不同的类型(例如gettype()可以接受所有的PHP类型,str_replace()可以接受字符串和数组)
number——可以是integer或者float
callback——例如call_user_function()或usort()接受用户自定义的函数作为一个参数
数据类型的转换:
自动类型转换——遵循转换按数据长度增加的方向进行,以保证精度不降低;布尔型、NULL、字符串在参与运算时会转换成Number型(true-1,false-0,NULL-0)
强制类型转换——(int)$foo、intval($foo)这两种方法都没有改变被转换变量本身的类型,settype($foo, "string")则改变本身的类型
变量类型测试函数——is_bool()、is_int()、is_float()、is_string()、is_array()、is_object()、is_resource()、is_null()、is_scalar()(标量)、is_numeric()(数字)、is_callable()(有效函数名)
常量:
使用define()函数来定义常量或确定是否已定义某常量
define(”GREETING“, "hello", true)——第三个参数为true时不区分大小写,默认为false;第二个参数是mixed类型,只接受标量
预定义变量:
魔术常量:
运算符:
字符变量只能递增,不能递减,并且只支持纯字母(a-z和A-Z)
递增递减不影响布尔值,NULL递减没有效果,但递增会变成1
位运算符只支持string、integer类型,分析时要化为二进制形式,再进行运算(&、|、^、~、<<、>>)
其他运算符:
?:——三目运算符
``——执行运算符,作为外壳命令来执行,并将其输出信息返回
@——错误控制运算符,置于一个表达式之前,该表达式可能产生的任何错误都会被忽略掉
=>——数组下标指定符号,指定数组的键与值
->——对象成员访问符号
instanceof——测定一个对象是否来自指定的对象类(对象instanceof类名)
第7章 PHP的流程控制结构
顺序结构、分支结构、循环结构
break——结束当前for、foreach、while、do-while、switch的执行
continue——跳过当前循环,进入下一次循环
exit——直接退出当前脚本
第8章 PHP的函数应用
局部变量、全局变量、静态变量
常规参数函数——实参和形参的个数相等,类型一致
伪类型参数函数——参数不需要指定类型,例如empty()、pow()
引用参数函数——参数是引用传递参数,即对传入参数的修改会传递给原变量,例如sort()
默认参数函数——例如person($name='张三'){……},参数被默认附上初值。注意:默认参数必须放在非默认参数的右侧,否则函数将不会按照预期工作。
可变个数参数函数——函数可以接受任意数量的参数
除了使用func_get_args外,还可以结合使用func_num_args()-返回参数总数和func_get_arg()函数来获取指定位置的参数function more_args() { $args = func_get_args(); // 将所有传递给函数的参数当作一个数组返回 …… }
回调函数——将函数作为参数传递到调用的函数中
1.变量函数
2.使用变量函数声明和应用回调函数function one($a, $b) { return $a + $b; } $result = "one"; echo $result(2, 3);
3.使用call_user_func_array()函数自定义回调函数function fun1($fun2) { $fun2(); } function fun2() {……}
4.类静态函数和对象的方法回调call_user_func_array($fun, array($a)); // $fun-函数名,$a-参数列表
class Demo{ static function fun($a, $b) {……} } call_user_func_array( array("Demo", "fun"), array('aaa', 'bbb')); // 第一个参数array(’类名称字符串‘, ’类中静态方法名称字符串‘) class Test{ function fun($a, $b) {……} } call_user_func_array( array(new Test(), 'fun'), array('aaa', 'bbb')); // 第一个参数array(对象引用, ’对象中方法名称字符串‘)
递归函数——自调用函数
第9章 PHP中的数组与数据结构
关联数组、索引数组
特别的赋值方法:$contact[0] = 1; // 索引数组 $contact['ID'] = 1; // 关联数组
数组的遍历:$contact[] = 1; // 默认下标为0,自增 $contact[14] = '高某'; // 指定非连续下标14 $contact[] = 'A公司'; // 下标为15,紧跟最高的下标值
foreach(array_expression as $key => $value) {……}
each($arr)
返回数组当前元素的键/值对,并向后移动数组指针到下一个元素的位置。
返回的是关联和索引混合的数组,键名为0、1、key、value。
如果指针越过了数组的末端,则返回false。
list($param1, $param2, $param3……) = $arr
仅能用于数字索引数组并假定数字索引从0开始。
将每个元素的值赋给list函数中的参数。
与while循环结合(执行完指针在数组末端,需要执行reset()方法才能重头遍历数组)
数组指针函数:while( list($key, $value) = each($contact) ) { echo "<dd> $key : $value </dd>"; }
current($arr)、key($arr)、next($arr)、prev($arr)、end($arr)、reset($arr)
预定义数组(超全局变量)
$_SERVER、$_ENV、$_GET、$_POST、$_REQUEST、$_FILES、$_COOKIE、$_SESSION、$GLOBALS
数组相关处理函数
array_values($arr)
array_keys($arr)
in_array($needle, $arr, true)——第三个参数为true时,只有数组中存在并且数据类型与给定值相同才返回true
array_search($val, $arr, true)——搜索给定的值,存在则返回相应键名
array_key_exists($key, $arr)——检查键名或索引是否存在与数组中
array_flip($arr)——将数组键值对调换,如果值重复,则最后一个键名覆盖值;如果原数组中的值数据类型不是字符串或整数,将报错
array_reverse($arr, true)——将数组元素顺序反转
统计数组的个数和唯一性
sizeof($arr)、count($arr)——元素个数
array_count_values($arr)——统计数组中所有值出现的次数
array_unique($arr)——删除数组中重复的值,并返回新的数组,其中将保留第一个元素
使用回调函数处理数组的函数
array_filter($arr, "fun")——将数组中每个元素的值传递到fun函数中,若返回true,则将结果组成一个新的数组返回
array_walk($arr, "fun", $data)——将数组中每个元素传递到fun函数中,第一个参数是value,第二个是key,第三个或更多是$data
array_map("fun", $arr1, $arr2)——将数组1和数组2的值依此传入fun函数中,fun函数必须返回值;如果fun为null,则返回两个数组的合集数组
数组的排序函数
sort()——从小到大,按照键值
rsort()——从大到小,按照键值
asort()——从小到大,按照键值,排序并保持索引关系
arsort()——从大到小,按照键值,排序并保持索引关系
ksort()——保留键值,从小到大,按照键名
krsort()——保留键值,从大到小,按照键名
array_multisort($arr1, $arr2, $arr3)——多维数组排序
拆分、合并、分解和接合数组
array_slice($arr, $offset, $length, true)——从数组中取出一段值并返回,第四个参数为true时,返回的数组将保留键名
array_splice($arr, $offset, $length, $arr2)——将选中的数组部分用第四个参数替换,如果没有指定替换的值,则原选中元素将插入到指定位置
array_combine(array $keys, array $values)——将$keys数组的值作为键,$values数组的值作为值,组合成新的数组,但如果其中一个数组为空或两个数组的元素个数不同,则返回false
array_merge($arr1,$arr2……)——将多个数组合并到一起,如果键名重复则取最后的一个值;如果是索引数组则会以连续方式重新索引
array_intersect($arr, $arr1, $arr2……)——求多个数组的交集,键名保留不变
array_diff($arr, $arr1, $arr2……)——求多个数组的差集,键名保留不变
数组与数据结构
array_push($arr, $data)——压入栈
array_pop($arr)——弹出最后一个元素
array_shift($arr)——删除数组第一个元素,所有元素向前移动
array_unshift($arr)——在数组开头插入一个或多个元素
其他数组处理函数
array_rand($arr, num)——随机抽取数组的一个或多个元素,并返回它们的键名
shuffle($arr)——将数组顺序打乱
array_sum($arr)——计算数组值总和
range(0, 50, 10)——创建一个包含指定范围的元素的数组,第三个参数为步长
unset()——消除一个数组元素,但索引不会重新建立
第10章 PHP面向对象的程序设计
php5的最大特点是引入了面向对象的全部机制,并且保留了向下兼容性。
定义成员属性必须有关键字public、private、static、var等,如不需要特定意义的修饰,就用var
构造方法:
每个类中默认存在一个没有参数列表并且内容为空的构造方法
在类中声明构造方法必须使用function __construct()
不存在构造方法重载,需通过设定默认参数来实现
析构方法:
php4中没有提供析构方法,是php5新添加的内容
需定义function __destruct()
对象的引用失去时调用的方法
封装性:
function __set($propertyName, $propertyValue)
function __get($propertyName)
function __isset($propertyName)——在外部调用isset方法检测对象中是否存在私有成员属性时,就会自动调用此方法
function __unset($propertyName)——在外部调用unset方法删除对象中私有成员属性时,就会自动调用此方法
继承性:
使用extends关键字
如子类需要访问父类的成员属性,则父类使用protected关键字修饰该成员属性
子类可以定义与父类同名的成员方法达到重载
通过parent::funName()来调用父类可能被覆盖的方法
子类覆盖父类的方法时,子类中重写的方法的访问权限一定不能低于父类被覆盖的方法的访问权限
常见关键字和魔术方法:
final:
可用于修饰类或类的方法,但不能修饰成员属性
被final标识的类不能被继承,被final标识的方法在子类中不能被覆盖
static:
static成员唯一存在,在多个对象之间共享
成员属于类,与对象实例和其他的类无关
通过类名::静态成员属性名、类名::静态成员方法名()来访问,在外部也可以使用这种方法
在类声明的成员方法中可以使用self来代替类名,但不能使用$this
静态方法中只能访问静态成员,因为非静态成员都必须通过对象的引用才能访问,而静态的方法在对象不存在的情况下也可以直接使用类名来访问。
单态设计模式:
一个类只能有一个实例对象存在
使用静态方法获取实例对象
class DB { private static obj = null; private function __construct() { echo "数据库连接成功!"; } static function getInstance() { if(isset(self::$obj)) self::$obj = new self(); // $obj为null,则实例化对象 return self::$obj; // 返回实例化对象 } function query($sql) { echo $sql; } } $db = DB::getInstance(); $db->query("select * from user");
const:
定义类中的常量,与static类似,都是通过类名或self进行访问
不能通过对象来访问
表示为常量的属性是只读的,不能重新赋值
instanceof:
确定一个对象是类的实例、类的子类,还是实现了某个特定接口,并进行相应的操作
clone:
$p2 = clone $p1——直接复制实例化对象,两个对象完全独立,互不干扰
在类中定义__clone()方法,则可以在实例化对象被克隆的时候执行操作
__toString():
直接echo 一个对象的时候会自动调用该方法,如果没有声明该方法,则会报错
__call($fun, $data):
在调用类中没有声明的方法时会自动调用的方法,第一个参数是调用的方法名,第二个是传入的参数
__autoload($className):
在类外定义的
在尝试使用一个当前文件没有定义的类时,会执行此方法,通过此方法自动载入对应的类
对象串行化:
把对象转化为二进制字符串
需要在网络中传输时,需要持久保存时
serialize($obj)、unserialize($obj)
__sleep()——在串行化前调用的函数,需返回一个数组,包含需要串行化的属性的数组,未在该数组内的属性将在串行化时被忽略
__wakeup()——在反串行化时自动调用,为成员属性重新赋值
抽象类:
使用abstract关键字修饰function或者class
只要类中有一个方法是抽象方法,则该类也是抽象类,要用abstract关键字修饰
抽象类中不能定义私有成员属性
抽象类必须由继承它的子类实现所有抽象方法,否则这个子类还是一个抽象类,不能实例化
接口类:
interface中不允许定义变量,只能定义常量和抽象方法,并且所有成员都是public访问权限的
使用implements关键字来实现,实现的类必须将接口所有的方法实现
接口之间也可以继承
PHP是单继承的,一个类只能有一个父类,但一个类可以实现多个接口
第11章 字符串处理
关于字符集合
将字符串看作字符集合时,并不是真的数组,使用count($str)并不能得到字符串的长度。
$str[0]、$str{0}两种方法都可以得到字符串的第一个字符,但自PHP4起,前者已不再使用,由后者代替。
字符串输出函数
echo($str)——输出字符串
print($str)——输出一个或多个字符串,与echo基本相同,但它有返回值1、0(成功、失败),另外执行效率没有echo高
die($str)——输出一条消息,并退出当前脚本,exit函数的别名,
printf($format, $arg1, $arg2……)——输出格式化字符串,arg1、arg2等参数插入到主字符串format中的百分号处,该函数是逐步执行的,如果%符号多于arg参数,则必须使用占位符,由数字和$组成,例如%2$、%1$等。
%%——百分比符号
%b——二进制数
%c——按照ASCII值的字符
%d——带符号十进制数
%e——可续计数法
%u——无符号十进制数
%f——浮点数
%F——浮点数
%o——八进制数
%s——字符串
%x——十六进制(小写字母)
%X——十六进制(大写字母)
sprintf($format, $arg1, $arg2……)——将格式化字符串写入一个变量中
字符串格式化函数
ltrim($str, array $charlist)、rtrim($str, array $charlist)、trim($str, array $charlist)
去除空格或预定义字符
系统默认去除下列字符:" "(空格)、"