我是靠谱客的博主 殷勤花瓣,最近开发中收集的这篇文章主要介绍读书笔记-《细说PHP》,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

《细说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
变量引用赋值:

$foo = "BOB";
$bar = &$foo;
$bar = "My name is Tom";
echo $bar; // 输出My name is Tom
echo $foo; // 输出My name is Tom
注意:PHP引用不像C语言的地址指针,$bar和$foo在内存上不同体,只是把各自的值相关联起来,参考下面例子。

$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='张三'){……},参数被默认附上初值。注意:默认参数必须放在非默认参数的右侧,否则函数将不会按照预期工作。

可变个数参数函数——函数可以接受任意数量的参数

function more_args() {
$args = func_get_args(); // 将所有传递给函数的参数当作一个数组返回
……
}
除了使用func_get_args外,还可以结合使用func_num_args()-返回参数总数和func_get_arg()函数来获取指定位置的参数

回调函数——将函数作为参数传递到调用的函数中

1.变量函数

function one($a, $b) {
return $a + $b;
}
$result = "one";
echo $result(2, 3);
2.使用变量函数声明和应用回调函数

function fun1($fun2) {
$fun2();
}
function fun2() {……}
3.使用call_user_func_array()函数自定义回调函数

call_user_func_array($fun, array($a)); // $fun-函数名,$a-参数列表
4.类静态函数和对象的方法回调

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)

去除空格或预定义字符

系统默认去除下列字符:" "(空格)、""(NULL)、"t"(制表符)、"n"(换行)、"r"(回车)

可以指定去除的范围,例如0..9即去除数字

str_pad($str, $length, $pad_str, $type)

填补字符串

有三种类型:STR_PAD_BOTH、STR_PAD_LEFT、STR_PAD_RIGHT(默认)

length是填补后字符串的长度

大小写转换

strtoupper()——转换成大写

strtolower()——转换成小写

ucfirst()——首字母大写

ucwords()——单词首字母大写

与html标签相关的字符串转换

nl2br($str)——在字符串换行之前插入<br />

htmlspecialchars($str, quote_style, charset)

将特殊字符进行转换,例如<转换成"&lt;"

第二个参数是引号的转换方式:ENT_COMPAT(只转换双引号,保留单引号)、ENT_QUOTES(同时转换两种引号)、ENT_NOQUOTES(不对引号进行转换)

第三个参数是字符编码

stripslashes($str)——将字符串中的反斜杠去掉(PHP默认配置:表单数据中引号和前面会自动加上一个)

addslashes($str)——添加反斜杠

strip_tags($str, tags)——删除字符串中的html标签,第二个参数是要保留的html标签,例如<h1>,多个则直接相连,例如<b><u><i>

其他字符串格式化

strrev($str)——反转字符串

number_format($number, $decimals, $dec_point, $thousand_sep)——格式化数字,默认以,分隔千位,第二个参数指定小数位数,第三个参数指定小数点分隔符,第四个参数指定千位分隔符

md5($str, $raw_output)——用md5算法加密字符串,第二个参数默认为false,输出32位的十六进制字符串,如果设置为true,则返回一个16位的二进制字符串

字符串比较

strcmp($str1, $str2)——区别大小写比较,等于返回0,str1大于str2返回1,小于返回-1

strcasecmp($str1, $str2)——忽略大小写比较

strnatcmp($str1, $str2)——自然排序进行字符串比较,字典排序里面4大于33,而自然排序中33比4大

strnatcasecmp($str1, $str2)——同上,只是忽略了大小写


第12章 正则表达式

正则表达式

定界符——正则表达式必须用/、!、#、{}、|来包含

原子

特殊符号必须在前面加反斜杠,例如/./、/*/

非打印字符,例如:r、n、rn、t、v、f

通用字符:d(十进制数字)、s(任意一个空白字符)、w(任意一个数字、字母或下划线),另外,D(任意一个非十进制数字),大写相反

范围:[0-9]、[a-z](ASCII)或自定义[apj]sp可以匹配asp、psp、jsp

元字符

*——匹配0次、1次或多次的原子

+——匹配1次或多次原子

?——匹配0次或1次其前的原子

.——除了换行符以外的任意一个字符

|——两个或多个分支选择

{n}——其前原子出现n次

{n, m}——其前原子至少出现n次,之多出现m次

^或A——以什么开头

$或Z——以什么结尾

b——单词边界,即有空格,例如/bisb/来匹配is单词

B——单词边界以外的部分,无空格,例如/Bisb/可匹配this

[]——方括号中任意一个原子

[^]——除方括号中的任意一个原子

()——多个原子组成的大原子

后向引用

/^d{4}Wd{2}Wd{2}$/ ——可匹配2015-06/15或2015/06-15或2015-06-15

/^d{4}(W)d{2}\1d{2}$/ ——匹配2015-06-15或2015/06/15

其中\1就是前面W的引用

/(Windows)(Linux)\2OS/ ——引用Linux

/(?:Windows)(Linux)\1OS/ ——同样是引用Linux,但使用了非捕获元字符?:、?=、?!来忽略对相关匹配的保存

模式修正符

加在最后一个界定符后,用于设定正则表达式模式

i——忽略大小写

m——将字符串视为多行

s——.将匹配所有字符,包括换行符

x——模式中的空白忽略不计,除非它已经被转义

e——只用在preg_replace()函数里面,替换字符串中对逆向引用做正常的替换

正则表达式函数

preg_match($pattern, $subject, $matches)

第三个参数用于存储匹配结果,其中matches[0]保存的是与pattern匹配的整体内容,而后面则是正则表达式中用()括起来的模式单元

该函数只做一次匹配,返回0或1的匹配结果数

preg_match_all($pattern, $subject, $matches, $flags)

用法与上相同,但该函数会执行知道字符串的结尾,返回匹配结果的次数。

其中第四个参数有两个值:PREG_PATTERN_ORDER、PREG_SET_ORDER,前者是按上方法一样排序匹配结果,后者则将matches[0]保存成第一个匹配结果的内容,matches[1]保存第二个匹配结果的内容

preg_grep($pattern, $arr)

对$arr的每个元素进行匹配,并返回匹配的数组

strstr($str, $needle)

未找到搜索的字符串,则返回false

第一次匹配成功后,返回字符串的剩余部分

stristr($str, $needle)

与上相同,只是对大小写不敏感

strpos($str, $needle)

没有找到字符串,则返回false

返回字符串在另一个字符串中第一次出现的位置

strrpos($str, $needle)

返回字符串在另一个字符串中最后一次出现的位置

stripos(), strripos()

与上相同,只是对大小写不敏感

preg_replace($pattern, $replacement, $subject, $limit)

将字符串替换并返回新的字符串

第四个参数$limit用于控制替换的次数

str_replace($search, $replace, $subject, $count)

与上基本相同

preg_split($pattern, $subject, $limit, $flags)

第三个参数控制最终返回的子串个数

第四个参数值有:PREG_SPLIT_NO_EMPTY(返回非空部分)、PREG_SPLIT_DELIM_CAPTURE(连同定界符模式中的括号表达式也会被返回)、PREG_SPLIT_OFFSET_CAPTURE(对每个出现的匹配结果同事返回其附属的字符串偏移量,返回的数组结构改变,第一项为匹配字符串,第二项为偏移量)

explode($separator, $string, $limit)

分割字符串

implode($glue, $pieces)

join为该函数的别名,将数组中所有元素组合成一个字符串,第一个参数是连接符,第二个是字符串数组








最后

以上就是殷勤花瓣为你收集整理的读书笔记-《细说PHP》的全部内容,希望文章能够帮你解决读书笔记-《细说PHP》所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部