首页 > 技术文章 > php基础总结

mumuyinxin 2019-01-07 20:44 原文

目录

期间看到的几篇有意思的博客

为什么 var_dump("1" == "1e0");的结果为true

PHP开发基础

PHP标记符(在PHP7中,仅支持标准标记和短标记)

标记类型 开始标记 结束标记 开启项
标准标记 <?php ?>
短标记 <? ?> short_open_tag=on
ASP式标记 <% %> asp_tags=on
Script标记 < script language="php" > < /script >

PHP注释

分类 风格 注释使用示例
单行注释 C++风格的单行注释“//” // 输出一句话
单行注释 Shell风格的注释“#” # 输出一句话
多行注释 C 风 格 的 多 行 注 释 “/……/” /
echo 'Hello, PHP';
echo 100 + 200;
/

PHP标识符

标识符:自定义一些符号来标记一些名称
标识符的定义需要遵循一定的规则,具体如下:

  • 标识符只能由字母、数字、下划线组成,且不能包含空格
  • 标识符只能以字母或下划线开头的任意长度的字符组成
  • 标识符区分大小写,类和关键词除外。
  • 如果标识符由多个单词组成,那么应使用下划线进行分隔

PHP关键字

关键字:是编程语言里预先定义好并赋予特殊含义的单词。

★表示从PHP5.3开始

●表示从PHP5.4开始

▲表示从PHP5.5开始

输出语句

echo:可将紧跟其后的一个或多个字符串、表达式、变量和 常量的值输出到页面中,多个数据之间使用逗号“,”分隔
print:与echo的用法相同,唯一的区别是print只能输出一个 值
print_r():PHP的内置函数,它可输出任意类型的数据,如字符串、数组等
var_dump():不仅可以打印一个或多个任意类型的数据,还可以获取数据的类型和元素个数

常量

常量定义使用define()函数,其基本格式如下:

define(\(name,\)value,\(case_insensitive); \)name:表示常量名称的字符串。
\(value:常量值,可以是字符串、整数或浮点数。 \)case_insensitive:其值为true或false,false为默认值。true表示该常量名称在使用时不区分大小写,false 表示要区分大小写。

defined()函数可用于测试常量是否已经定义:

  • defined("常量名称");
  • 若常量已经被定义,函数返回TRUE,否则返回FALSE。

constant()函数来获得常量值:

  • constant("常量名称");

预定义常量

变量

概念:变量就是保存可变数据的容器。
组成:在PHP中,变量名是由$和标识符组成。

PHP 变量规则:

变量以 $ 符号开头,其后是变量的名称
变量名称必须以字母或下划线开头,不能以数字开头
变量名称只能包含字母、数字、字符和下划线
变量名称对大小写敏感

传值赋值:指直接将数据或变量的值复制放 到变量内存中。

引用赋值:是指将变量的地址传递给另一个 变量,使两个变量具有相同的内存地址。

由于PHP是一种弱语言,变量不需要事先声明,就可以直接进行赋值使用。
实现方式:

  • 传值赋值:变量默认总是传值赋值,将“=”左边的数据赋值为右边的变量(含直接赋值) 。
  • 引用赋值:所谓引用赋值就是在要赋值的变量前添加“&”符号。

数据类型

标量数据类型(整型)

整型可以由十进制、八进制和十六进制数指定

  • 在它前面加上“-”符号,可以表示负数。
  • 八进制数使用0~7表示,且数字前必须加上0
  • 十六进制数使用09与AF表示,数字前必须加上0x
标量数据类型(字符串型)

概念:字符串是由连续的字母、数字或字符组成的字符序列。
表示方式:分别为单引号、双引号、定界符三种语法结构。

  • 单引号括起来的字符串被原样输出

  • 双引号字符串中的变量被PHP解析为变量值,即字符串中的变量在输出时输出变量的值而不是变量名称。

  • 定界符字符串中的变量被PHP解析为变量值

    $变量 = <<<标识符

    字符串内容

    ...

    字符串内容

    标识符;

    $poetry =<<<ccc
    <br>春眠不觉晓
    <br>处处闻啼鸟
    <br>夜来风雨声
    <br>花落知多少
    ccc;
    echo $poetry;
    

标量数据类型(字符串型)

总结字符串各表示方式的区别:

  • 变量在双引号或定界符结构字符串中被解析,而在单引号中原样输出。
  • 单引号字符串只对“‘”和“\”进行转义;而双引号字符串支持多种转义字符。

检测数据类型

如果检测的值符合检测的数据类型,则返回true,否则返回false。

运算符、表达式和流程控制语句

算术运算符

名称 操作符 实例
幂运算(php5.6新增) ** \(a**\)b

赋值串运算符(+=、-=、*=、/=、.=、%=、**=同理)

名称 符号 实例 展开形式 意义
幂运算(php5.6新增) ** \(a**=\)b $a = \(a**\)b 将左边的值和右边的值幂运算,赋给左边

逻辑运算符

运算符 运算 范例 结果
xor 异或 $a xor $b \(a和\)b一个为true,一个为false,结果为true,否则为false

数据类型转换

数据类型转换是指将变量或值转换为另一种数据类型。

分为自动数据类型转换和强制类型转换

自动数据类型转换
  • 变量的数据类型由存入变量的数据来决定,即在存入不同
  • 类型数据时,变量的数据类型就自动发生转换。
  • 或者在使用不同类型的数据进行运算时,所有数据自动转
  • 换为一种类型进行运算。
数据类型的自动转换时遵循的规则
  • 布尔型数据和数值型数据在进行算术运算时,true被转换为整数1,false被转换为整数0。
  • 字符串型数据和数值型数据在进行算术运算时,如果字符串以数字开头,将被转换为相应的数字;如果字符串不是以数字开头,将被转换为整数0。
  • 在进行字符串连接运算时,整数、浮点数将被转换为字符串型数据,布尔值true将被转换为字符串 "1",布尔值false和NULL将被转换为空字符串""。
  • 在进行逻辑运算时,整数0、浮点数0.0、空字 符串""、字符串"0"、NULL以及空数组将被转换为布尔值false,其他数据将被转换为布尔值true。

强制类型转换

PHP支持3种方式转换数据类型,分别为使用类型名、 使用类型取值函数和设置变量类型转换。

使用类型名转换类型

使用类型取值函数

跳转语句和终止语句

break语句

break语句可以终止当前的循环,包括while、do…while 、for、foreach和switch在内的所有控制语句。

continue语句 在执行continue语句后,程序将结束本次循环的执行, 并开始下一轮循环的执行操作。

exit语句
exit语句的作用是终止整个PHP程序的执行,在exit语 句后的所有PHP代码都不会执行。

数组和字符串

数组构成:数组是由一个或多个数组元素组成的
数组元素:一每个数组元素由键(Key)和值(Value)构成
键:“键”为元素的识别名称,也被称为数组下标
值: “值”为元素的内容
映射: “键”和“值”之间存在一种对应关系,称之为映射
类型划分:根据键的数据类型,可以将数组划分为索引数组
和关联数组

索引数组

索引数组是指键名为整数的数组。默认情况下,索引数组的键名是从0开始,并依次递增。它主要适用于利用位置(0、1、2……)来标识数组元素。另外,索引数组的键名也可以自己指定。

关联数组

关联数组是指键名为字符串的数组。关联数组的“键”“是字符串或数值的混合,并与“值”之间具有一一对应的关系。

赋值方式

使用赋值方式定义数组,实际上就是创建一个数组变量,然后使用赋值运算符直接给变量赋值。

赋值方式定义数组就是单独为数组元素赋值。 需要注意的是,赋值方式不能定义一个空数组

我的意见是先定义,后赋值。

短数组定义法

短数组定义法([])与array()语法结构相同,只需将array()替换为[]即可

二维数组

$str =

array (
"PHP类图书"=>array ("PHP从入门到精通","PHP 典型模块","PHP标准教程"),

"JAVA类图书"=>array ("a"=>"JAVA范例手册 ","b"=>"JAVA WEB范例宝典"),

"ASP类图书"=>array ("ASP从入门到精通 ",2=>"ASP范例宝典","ASP典型模块")

);

访问数组

数组定义完成后,若想要查看数组中某个具体的元素,则可以通过“数组名[键]”的方式获取。

遍历数组--foreach

//方式一
foreach (数组名称 as 键 => 值) 
{
	// 处理语句
}
//方式二
foreach (数组名称 as 值)
{
	// 处理语句
}

遍历数组--each

  • each()函数返回一个包含数组当前元素键/值对应的数组 ,并将数组指针指向下一个数组元素。
  • each()函数返回的数组包含4个元素,元素键依次为1、 value、0和key。1和value对应元素为原数组元素的值, 0和key对应元素为原数组元素的键。
  • 如果数组指针指向了数组末尾(最后一个元素之后),则 返回FALSE。

遍历数组--list

  • list()函数用于将数组中各个元素的值赋值给指定的变量
  • list()函数依次将下标为0、1、2…的数组元素赋值为指定的变量。
  • 如果数组中的元素没有这些下标,变量值为NULL,PHP会产生一个Notice错误信息。

遍历数组—list、each

<?php 
$array=
array(
    0 =>'PHP自学视频教程', 
    1 =>'JAVA自学视频教程', 
    2 =>'VB自学视频教程',
    3=>"VC自学视频教程"
); //遍历数组中的数据 while(list($name,$value)=each($array))
{ 
    //输出遍历结果 
    echo "$name=$value"."\n"; 
} 
?>

创建数组(返回值为数组)

range()函数创建一个包含指定范围的元素的数组。

array range( int low, int high , int step)
low	必需。规定数组元素的最小值。
high	必需。规定数组元素的最大值。
step	可选。规定元素之间的步进制。默认是 1。

array_combine()函数用两个数组创建一个新的数组,其中的一个数组元素为键名,另一个数组的元素为键值。

array array_combine( array keys, array values)
keys	必需。规定数组的键名。
values	必需。规定数组的键值。
注意:键名数组和键值数组的元素个数必须相同!

array_merge()函数将多个数组连接成一个新的数组

array array_merge(array1,array2,array3...)
array1	必需。规定数组。
array2	可选。规定数组。
array3	可选。规定数组。
后合并进来的数组,如果键名与之前合并的数组的键名相同,发生冲突,会覆盖之前对应的数组元素

array_fill()函数用给定的数量的值填充或建立一个数组

array array_fill( int start_index, int num, mixed value)
start_index	必需。规定返回数组的起始索引。
num	必需。规定填充的元素的数量,其值必须大于 0。
value	必需。规定用于填充数组的键值。

数组统计

count()函数用于对数组中的元素个数进行统计。

count(array,mode);
array	必需。规定要计数的数组。
mode	可选。规定函数的模式。可能的值:
0 - 默认。不计算多维数组中的所有元素。
1 - 递归地计算数组中元素的数目(计算多维数组中的所有元素)。
返回值:函数返回数组中元素的数目。

max()函数用于计算数组中元素的最大值。

mixed max( array arr )
返回值:数组中元素的最大值

min()函数用于计算数组中元素的最小值。

mixed min( array arr )
返回值:数组中元素的最小值

array_sum()函数用于计算数组中所有值的和。

mixed array_sum( array arr )
返回值:数组中所有值的和

array_count_values()函数用于计算数组中元素出现次数。

mixed array_count_values( array arr )
返回值:数组,
arr数组中值为返回值数组的键名,
arr数组中值的出现次数为返回值数组的值。

数组指针

next():使数组指针指向下一个元素。 
prev():使数组指针指向前一个元素。
end():使数组指针指向最后一个元素。
reset():使数组指针指向第一个元素。
current():返回当前数组元素的值。
key():返回当前数组元素的键名。

数组和变量之间的转换

extract()函数使用数组定义一组变量。

该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
该函数返回成功设置的变量数目。
$arr = array("name"=>"张三","sex"=>"男","age"=>20); extract($arr);//将数组元素定义在变量中 
echo $name;//输出变量值 
echo $sex;//输出变量值 echo $age;//输出变量值

int extract(array,extract_rules,prefix)
array	必需。规定要使用的数组。
extract_rules	可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。
可能的值:
EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。
EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。
EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。
EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。
EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
prefix	可选。如果 extract_rules 参数的值是 EXTR_PREFIX_SAME、EXTR_PREFIX_ALL、 EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS,则 prefix 是必需的。 
该参数规定了前缀。前缀和数组键名之间会自动加上一个下划线。

compact()函数使用变量建立数组。

int compact (( mixed var1, mixed var2...])
var1	必需。可以是带有变量名的字符串,或者是一个变量数组。
var2,...	可选。可以是带有变量名的字符串,或者是一个变量数组。允许多个参数。
$a = "asp";//声明变量 $b = "php";//声明变量 $c = "jsp";//声明变量 $result = compact("a","b","c");//生成数组
Array([a]=>asp [b]=>php [c]=>jsp)

数组检索函数

array_keys()函数返回包含数组中所有键名的一个新数组。

array array_keys(array,value,strict)
array	必需。规定数组。
value	可选。您可以指定键值,然后只有该键值对应的键名会被返回。
strict	可选。与 value 参数一起使用。可能的值:
true - 返回带有指定键值的键名。依赖类型,数字5 与字符串"5"是不同的。
false - 默认值。不依赖类型,数字5与字符串"5"是相同的。
被返回的数组将使用数值键,键名从0开始且以1递增,键值为数组array中所有的键名。

$array = array (0 => 100, "php" => "图书"); 
$arr1 = array_keys($array); 
$array = array ("php", "asp", "java", "php"); 
$arr2 = array_keys($array, "php");

array(2){[0]=>int(0) [1]=>string(3)"php"}
array(2){[0]=>int(0) [1]=>int(3)}

array_values()函数获取数组中所有的值。

array array_values ( array input )
$array = array ("手册" => "php函数手册", "php基础应用", "php" => "php函数手册", "php基础应用", "php典型案例");
$result = array_values($array);
被返回的数组将使用数值键,键名从0开始且以1递增,键值为数组input中所有的值。

in_array ()函数在数组中查找某个值。

bool in_array ( mixed needle, array array [, bool strict])
needle	必需。规定要在数组搜索的值。
array	必需。规定要搜索的数组。
strict	可选。如果该参数设置为 TRUE,则 in_array() 函数检查搜索的数据与数组的值的类型是否相同。
$array = array("Php", "asP", "jAva", "html"); if(in_array("php", $array)){ echo "php in array"; } if(in_array("jAva", $array)){ echo " jAva in array"; }

array_search ()函数在数组中搜索某个键值,并返回对应的键名。

mixed array_search ( mixed needle, array array [, bool strict])
needle	必需。规定在数组中搜索的键值。
array	必需。规定被搜索的数组。
strict	可选。如果该参数被设置为 TRUE,则函数在数组中搜索数据类型和值都一致的元素。可能的值:
true
false - 默认
如果设置为 true,则在数组中检查给定值的类型,数字 5 和字符串 5 是不同的(参见实例 2)。

$arr = array ("asp", "php", "60");
if(array_search (60, $arr))
{ 
	echo "60在数组1中 <br />";
} 
if(array_search (60, $arr, true))
{ 
	echo "60在数组2中 <br />";
}

array_key_exists ()函数在数组中查找某个键名,如果键名存在则返回 true,如果键名不存在则返回 false。

提示:请记住,如果您指定数组的时候省略了键名,将会生成从 0 开始并以 1 递增的整数键名。

bool array_key_exists ( mixed key, array search)
key	必需。规定键名。
array	必需。规定数组。
$array = array("php" => 58, "ajax" => 54);
if (array_key_exists("php", $array)) 
{ 
	echo "php在数组中";
}

array_unique ()函数删除数组中重复的数。如果两个或更多个数组值相同,只保留第一个值,其他的值被移除。

注意:被保留的数组将保持第一个数组项的键名类型。

array array_unique ( array array)
$arr_int = array ("PHP","JAVA","ASP","PHP","ASP");
$result=array_unique($arr_int);
print_r($result);

数组排序

  • sort():根据元素值升序排序,排序后元 素的下标按顺序为0、1、2…
  • asort():根据元素值升序排序,保持原 有的键值。
  • rsort():sort()的逆序。
  • arsort():asort的逆序。
  • ksort():根据键升序排序,保持键值对。
  • krsort():ksort的逆序。
  • natsort():对值按照“自然排序”升序,保持键值对。
  • natcasesort():不区分大小写。

sort()函数根据数组元素值以升序进行排序。

注:排序后的数组赋予新的“整数”键名,键名从0开始且以1递增,键值同原数组键值。

bool sort( array &array , int sortingtype )
array	必需。规定要进行排序的数组。
sortingtype	可选。规定如何排列数组的元素/项目。可能的值:
0 = SORT_REGULAR - 默认。把每一项按常规顺序排列(Standard ASCII,不改变类型)。
1 = SORT_NUMERIC - 把每一项作为数字来处理。
2 = SORT_STRING - 把每一项作为字符串来处理。
3 = SORT_LOCALE_STRING - 把每一项作为字符串来处理,基于当前区域设置(可通过 setlocale() 进行更改)。
4 = SORT_NATURAL - 把每一项作为字符串来处理,使用类似 natsort() 的自然排序。
5 = SORT_FLAG_CASE - 可以结合(按位或)SORT_STRING 或 SORT_NATURAL 对字符串进行排序,不区分大小写。
$array = array("a"=>"asp", "p"=>"php", "j"=>"jsp");
sort($array);
print_r($array);

asort()函数根据数组元素值以升序进行排序。

注:排序后的数组元素保持原有的“键值”,键值同原数组键值,针对原先数组进行键值对顺序调换。

bool asort( array &array [, int sort_flags] )
$array = array("a"=>"asp", "p"=>"php", "j"=>"jsp");
asort($array);
print_r($array);

ksort()函数根据数组元素的“键名”以升序排序。

注:排序后的数组元素保持原有的“键值”

bool ksort ( array &array [, int sortingtype])
array	必需。规定要进行排序的数组。
sortingtype	可选。规定如何排列数组的元素/项目。可能的值:
0 = SORT_REGULAR -默认。把每一项按常规顺序排列(Standard ASCII,不改变类型)。
1 = SORT_NUMERIC - 把每一项作为数字来处理。
2 = SORT_STRING - 把每一项作为字符串来处理。
3 = SORT_LOCALE_STRING - 把每一项作为字符串来处理,基于当前区域设置(可通过 setlocale() 进行更改)。
4 = SORT_NATURAL - 把每一项作为字符串来处理,使用类似 natsort() 的自然排序。
5 = SORT_FLAG_CASE - 可以结合(按位或)SORT_STRING 或 SORT_NATURAL 对字符串进行排序,不区分大小写。

$array = array("a"=>"asp", "p"=>"php", "j"=>"jsp");
ksort($array);
print_r($array);

数组与数据结构

int array_push ( array array, mixed var1 , mixed var2...)函数向数组尾部插入一个或多个元素。
注意:即使您的数组有字符串键名,您所添加的元素将是数字键名。
array	必需。规定一个数组。
var1	必需。规定要添加的值。
var2	可选。规定要添加的值。
mixed array_pop ( array array)函数删除数组中的最后一个元素。
mixed array_shift ( array array) 函数用于删除数组中的第一个元素,并返回被删除的元素键值。
注释:如果键名是数字的,所有元素都将获得新的键名,从 0 开始,并以 1 递增。
int array_unshift ( array array, mixed value1 [, mixed value2...]) 函数用于向数组插入新元素。新数组的值将被插入到数组的开头。
注释:数值键名将从 0 开始,以 1 递增。字符串键名将保持不变。
array	必需。规定数组。
value1	必需。规定插入的值。
value2	可选。规定插入的值。

数组集合

array_diff()函数用于比较两个(或更多个)数组的键值,并返回差集

array array_diff ( array array1, array array2 [, array array3...])
array1	必需。与其他数组进行比较的第一个数组。
array2	必需。与第一个数组进行比较的数组。
array3,...	可选。与第一个数组进行比较的其他数组。
该函数比较两个(或更多个)数组的键值,并返回一个差集数组,该数组包括了所有在被比较的数组(array1)中,但是不在任何其他参数数组(array2 或 array3 等等)中的键值。

array_intersect ()函数用于比较两个(或更多个)数组的键值,并返回交集

array array_intersect ( array array1, array array2 [, array array3...])
array1	必需。与其他数组进行比较的第一个数组。
array2	必需。与第一个数组进行比较的数组。
array3,...	可选。与第一个数组进行比较的其他数组。
该函数比较两个(或更多个)数组的键值,并返回一个交集数组,该数组包括了所有在被比较的数组(array1)中,同时也在任何其他参数数组(array2 或 array3 等等)中的键值。

array_reverse()函数将反转数组中的元素

array array_reverse(array,preserve)
array	必需。规定数组。
preserve	可选。规定是否保留原始数组的键名。
如果设置为 TRUE 会保留数字的键。 非数字的键则不受这个设置的影响,总是会被保留。 
可能的值:
true
false

<?php
    $a=array("a"=>"Volvo","b"=>"BMW","c"=>"Toyota");
    print_r(array_reverse($a));
?>
Array ( [c] => Toyota [b] => BMW [a] => Volvo )
返回值:是经过反转的数组,原先数组不受影响。

isset()函数用于检测变量是否已设置并且非 NULL。

bool isset ( mixed var [, mixed var [, ...]])
如果一次传入多个参数,那么 isset() 只有在全部参数都被设置时返回 TRUE,计算过程从左至右,中途遇到没有设置的变量时就会立即停止。

返回值: 
若变量不存在则返回 FALSE 
若变量存在且其值为NULL,也返回 FALSE 
若变量存在且值不为NULL,则返回 TURE

unset()函数用于销毁指定变量

void unset ( mixed $var [, mixed $... ] )
没有返回值。

字符串与数组转换

字符串作为数组访问

分割字符串

explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。

array explode ( string $separator , string $str [, int $limit ] )
separator	必需。规定在哪里分割字符串。
string	必需。要分割的字符串。
limit	可选。规定所返回的数组元素的数目。
可能的值:
大于 0 - 返回包含最多 limit 个元素的数组
小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组
0 - 会被当做 1, 返回包含一个元素的数组

$fish =  'Bass, Carp, Pike, Flounder'; $fish_list = explode(',', $fish); print "The second fish is $fish_list[1]";

合成字符串

implode() 函数返回一个由数组元素组合成的字符串。

string implode(separator,array)
separator	可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
array	必需。要组合为字符串的数组。

<?php
    $arr = array('Hello','World!','Beautiful','Day!');
    echo implode(" ",$arr);
?>

Hello World! Beautiful Day!

转义、还原字符串

手动转义、还原字符串

echo ‘select * from tb_book where bookname=\’PHP自学视频教程\’’

自动转义字符串
string addslashes ( string $str )

$str = "Is your name O'reilly?"; 
echo addslashes($str);

自动还原字符串
string stripslashes ( string $str )

$str = "Is your name O\'reilly?"; 
echo stripslashes($str);

获取字符串长度

int strlen ( string $string )

在utf-8下,汉字占3个字符,其它情况下2个字符

数字、英文、小数点、下划线和空格各占一个字符。

截取字符串

substr() 函数返回字符串的一部分。

string substr ( string $string , int $start, int $length)
string	必需。规定要返回其中一部分的字符串。
start	必需。规定在字符串的何处开始。
正数 - 在字符串的指定位置开始
负数 - 在从字符串结尾的指定位置开始
0 - 在字符串中的第一个字符处开始
length	可选。规定要返回的字符串长度。默认是直到字符串的结尾。
正数 - 从 start 参数所在的位置返回
负数 - 从字符串末端返回

string mb_substr ( string $str , int $start [, int $length
[, string $encoding ]] )
<?php 
    $str="PHP自学视频教程"; 
    echo mb_substr($str, 0, 5, 'UTF-8'); 
?>

比较字符串

按字节比较

int strcmp ( string $string1 , string $string2 )
string1	必需。规定要比较的第一个字符串。
string2	必需。规定要比较的第二个字符串。

返回值:	该函数返回:
0 - 如果两个字符串相等
<0 - 如果 string1 小于 string2
>0 - 如果 string1 大于 string2

int strcasecmp ( string $str1 , string $str2 )
注:strcmp区分大小写,strcasecmp不区分大小写

按自然排序法比较

int strnatcmp ( string $str1 , string $str2 )
<?php
    $str1="str2.jpg";    
    $str2="str10.jpg";    
    echo strcmp($str1, $str2);    
    echo strnatcmp($str1, $str2);
?>

按指定源字符串的位置比较

int strncmp ( string $str1 , string $str2 , int len)
<?php
$str1="I like PHP!";    
$str2=”i like my student!";    
echo strncmp($str1, $str2, 6);
?>

检索字符串

strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及该字符串之后的剩余部分,否则返回 FALSE。

string strstr(string,search,before_search)
string	必需。规定被搜索的字符串。
search	必需。规定所搜索的字符串。如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符。
before_search	可选。一个默认值为 "false" 的布尔值。如果设置为 "true",它将返回 search 参数第一次出现之前的字符串部分。
<?php
    $email  = 'name@example.com';    
    $domain = strstr($email, '@');    
    echo $domain; 
?>

substr_count() 函数计算子串在字符串中出现的次数。
注意:

子串是区分大小写的。
该函数不计数重叠的子串 。
如果 start 参数加上 length 参数大于字符串长度,该函数则生成一个警告。

string substr_count(string,substring,start,length)
string	必需。规定要检查的字符串。
substring	必需。规定要检索的字符串。
start	可选。规定在字符串中何处开始搜索。
length	可选。规定搜索的长度。
返回值:子串在字符串中出现的次数。

strtok() 函数把字符串分割为更小的字符串(标记)。

string strtok(string,split)
参数	描述
string	必需。规定要分割的字符串。
split	必需。规定一个或多个分割字符。
<?php
    $first_token = strtok('/something', '/');
    $second_token = strtok('/');
    var_dump($first_token, $second_token);
?>
运行结果:
Hello
world.
Beautiful
day
today.

<?php
    $string = "Hello world. Beautiful day today.";
    $token = strtok($string, " ");
    while ($token != false)
    {
        echo "$token<br>";
        $token = strtok(" ");
    } 
?>
运行结果:
string(9) "something" bool(false)

替换字符串

str_replace() 函数替换字符串中的一些字符(区分大小写)。

该函数必须遵循下列规则:

  • 如果搜索的字符串是一个数组,那么它将返回一个数组。
  • 如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
  • 如果同时需要对某个数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余的元素将用空字符串进行替换。
  • 如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。

注意:

该函数是区分大小写的。请使用 str_ireplace() 函数执行不区分大小写的搜索。

mixed str_replace(find,replace,string,count)
参数	描述
find	必需。规定要查找的值。
replace	必需。规定替换 find 中的值的值。
string	必需。规定被搜索的字符串。
count	可选。一个变量,对替换数进行计数。

$arr = array("blue","red","green","yellow");
print_r(str_replace("red","pink",$arr,$i));
echo "<br>" . "Replacements: $i";
运行结果:
Array ( [0] => blue [1] => pink [2] => green [3] => yellow ) 
Replacements: 1

substr_replace() 函数把字符串的一部分替换为另一个字符串。

注意:如果 start 参数是负数且 length 小于或者等于 start,则 length 为 0。

mixed substr_replace ( mixed $string , mixed $replacement , mixed $start [, mixed $length ] )
string	必需。规定要检查的字符串。
replacement	必需。规定要插入的字符串。
start	必需。规定在字符串的何处开始替换。
    正数 - 在字符串的指定位置开始
    负数 - 在从字符串结尾的指定位置开始
    0 - 在字符串中的第一个字符处开始
length	可选。规定要替换多少个字符。默认是与字符串长度相同。
    正数 - 被替换的字符串长度
    负数 - 从字符串末端开始的被替换字符数
    0 - 插入而非替换
    
$credit_card = '4111 1111 1111 1111';
print substr_replace($credit_card, 'xxxx ', 0, strlen($credit_card)-4);


去掉字符串首尾空格和特殊字符

trim() 函数移除字符串两侧的空白字符或其他预定义字符。

trim(string,charlist)
参数	描述
string	必需。规定要检查的字符串。
charlist	可选。规定从字符串中删除哪些字符。如果省略该参数,则移除下列所有字符:
    "\0" - NULL
    "\t" - 制表符
    "\n" - 换行
    "\x0B" - 垂直制表符
    "\r" - 回车
    " " - 空格

ltrim() 函数移除字符串左侧的空白字符或其他预定义字符。

ltrim(string,charlist)
参数	描述
string	必需。规定要检查的字符串。
charlist	可选。规定从字符串中删除哪些字符。如果省略该参数,则移除下列所有字符:
    "\0" - NULL
    "\t" - 制表符
    "\n" - 换行
    "\x0B" - 垂直制表符
    "\r" - 回车
    " " - 空格

rtrim() 函数移除字符串右侧的空白字符或其他预定义字符。

rtrim(string,charlist)
参数	描述
string	必需。规定要检查的字符串。
charlist	可选。规定从字符串中删除哪些字符。如果省略该参数,则移除下列所有字符:
    "\0" - NULL
    "\t" - 制表符
    "\n" - 换行
    "\x0B" - 垂直制表符
    "\r" - 回车
    " " - 空格

字符串与HTML转换

htmlentities() 函数把字符转换为 HTML 实体。

htmlentities(string,flags,character-set,double_encode)
参数	描述
string	必需。规定要转换的字符串。
flags	可选。规定如何处理引号、无效的编码以及使用哪种文档类型。
        可用的引号类型:
        ENT_COMPAT - 默认。仅编码双引号。
        ENT_QUOTES - 编码双引号和单引号。
        ENT_NOQUOTES - 不编码任何引号。
        无效的编码:
        ENT_IGNORE - 忽略无效的编码,而不是让函数返回一个空的字符串。应尽量避免,因为这可能对安全性有影响。
        ENT_SUBSTITUTE - 把无效的编码替代成一个指定的带有 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD; 的字符,而不是返回一个空的字符串。
        ENT_DISALLOWED - 把指定文档类型中的无效代码点替代成 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD;。
        规定使用的文档类型的附加 flags:
        ENT_HTML401 - 默认。作为 HTML 4.01 处理代码。
        ENT_HTML5 - 作为 HTML 5 处理代码。
        ENT_XML1 - 作为 XML 1 处理代码。
        ENT_XHTML - 作为 XHTML 处理代码。
character-set	可选。一个规定了要使用的字符集的字符串。
                允许的值:
                UTF-8 - 默认。ASCII 兼容多字节的 8 位 Unicode
                ISO-8859-1 - 西欧
                ISO-8859-15 - 西欧(加入欧元符号 + ISO-8859-1 中丢失的法语和芬兰语字母)
                cp866 - DOS 专用 Cyrillic 字符集
                cp1251 - Windows 专用 Cyrillic 字符集
                cp1252 - Windows 专用西欧字符集
                KOI8-R - 俄语
                BIG5 - 繁体中文,主要在台湾使用
                GB2312 - 简体中文,国家标准字符集
                BIG5-HKSCS - 带香港扩展的 Big5
                Shift_JIS - 日语
                EUC-JP - 日语
                MacRoman - Mac 操作系统使用的字符集
                注释:在 PHP 5.4 之前的版本,无法被识别的字符集将被忽略并由 ISO-8859-1 替代。自 PHP 5.4 起,无法被识别的字符集将被忽略并由 UTF-8 替代。
double_encode	可选。一个规定了是否编码已存在的 HTML 实体的布尔值。
                TRUE - 默认。将对每个实体进行转换。
                FALSE - 不会对已存在的 HTML 实体进行编码。

反转字符串

string strrev ( string $string )

print strrev('This is not a palindrome.');
运行结果:
emordnilap a ton si sihT

重复字符串

string str_repeat ( string $str , int $times )
$str:重复字符串
$times:重复次数

字符串小写化

string strtolower ( string $string )
<?php 
    $str = "Mary Had A Little Lamb and She LOVED It So";    
    $str = strtolower($str);    
    echo $str; 
?>

字符串大写化

string strtoupper ( string $string )
<?php 
    $str = "Mary Had A Little Lamb and She LOVED It So";    
    $str = strtoupper($str);    
    echo $str; 
?>

ucfirst() 函数把字符串中的首字符转换为大写。

string ucfirst ( string $string )

ucwords() 函数把字符串中每个单词的首字符转换为大写。

string ucwords ( string $string )

chr() 函数从指定 ASCII 值返回字符。

ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置 0,十六进制值被定义为带前置 0x。

string chr ( int $ascii ) 
参数	描述
ascii	必需。ASCII 值。

ord() 函数返回字符串中第一个字符的 ASCII 值。

string ord ( string $string )

str_pad()把字符串填充为新的长度。

string str_pad(string,length,pad_string,pad_type)
参数	描述
string	必需。规定要填充的字符串。
length	必需。规定新字符串的长度。如果该值小于原始字符串的长度,则不进行任何操作。
pad_string	可选。规定供填充使用的字符串。默认是空白。
pad_type	可选。规定填充字符串的哪边。
可能的值:
STR_PAD_BOTH - 填充字符串的两侧。如果不是偶数,则右侧获得额外的填充。
STR_PAD_LEFT - 填充字符串的左侧。
STR_PAD_RIGHT - 填充字符串的右侧。这是默认的。

md5() 函数计算字符串的 MD5 散列。

string md5(string,raw)
参数	描述
string	必需。规定要计算的字符串。
raw	可选。规定十六进制或二进制输出格式:
TRUE - 原始 16 字符二进制格式
FALSE - 默认。32 字符十六进制数

函数

自定义函数

PHP中的函数

  • 系统的内置函数
  • 自定义函数
  • 变量函数

参数传递方式

  • 按值传递

    function example( $m ){ }
    
    
  • 按引用传递

    function example( &$m ){ }
    
    
  • 默认参数

function values($price,$tax="")
{ 
    $price=$price+($price*$tax); 
    echo "价格:$price<br>"; 
} 
values(100,0.25);        
values(100); 

通常函数将返回值传递给调用者的方式是使用return语句。

变量的作用域

全局变量
即被定义在所有函数以外的变量,其作用域是整个PHP 文件,但是在用户自定义函数内部是不可用的。想在用户自定义函数内部使用全局变量,要使用global关键词声明,或者通过使用全局数组$globals进行访问
局部变量
即在函数的内部定义的变量,这些变量只限于在函数内部使用,在函数外部不能被使用
静态变量
能够在函数调用结束后仍保留变量值,当再次回到其作用域时,又可以继续使用原来的值。而一般变量是在函数调用结束后,其存储的数据值将被清除,所占的内存空间被释放。使用静态变量时,先要用关键字static来 声明变量,需要把关键字static放在要定义的变量之前

文件包含语句

作用:在程序开发中,会涉及到多个PHP文件。为此,PHP提
供了包含语句,可以从另一个文件中将代码包含进来。
好处:不仅可以提高代码的重用性,还可以提高代码的维护和
更新的效率。

  • include

    include格式如下:
    include '文件路径';“文件路径”指的是被包含文件所在的绝对路径或相对路径。
    在相对路径中,“./”表示当前目录,“../”表示当前目录的上级目录。

  • require

  • include_once

  • require_once

require语句与include语句的区别:

在包含文件时,如果没有找到文件,include语句会发生警告信息 ,程序继续运行;而require语句会发生致命错误,程序停止运行 。

require()语句一般放在PHP脚本页面的最前面,PHP在执行前, 就先读入require()引入的文件,文件的内容会变成此脚本的一部分 ,一旦出现错误,则立即退出程序。

include()语句一般在用到时才引入,所以通常是放在流程控制的处 理区段中,PHP脚本在执行到它时,才会将文件包含进来。

即require()是预加载机制,位置在脚本最前面,一开始就引入所有 可能用到的文件;include()是即用即加载,位置灵活。

require_once语句的区别:
虽然include_once、require_once语句,和include、require的作用几乎相同,但是不同的是带“_once”的语句会先检查要包含的文件是否已经被包含过,避免了同一文件被重复包含的情况。

PHP与Web页面交互

服务器端获取数据的其他方法

全局变量\(_REQUEST默认情况下包含了\)_GET、\(_POST和\)_COOKIE之中的数据。

不管用GET还是POST,两种方式提交的参
数均可用“$_ REQUEST ['参数名']”获得
参数值。

$_SERVER[ ](超)全局变量 
数组元素 说明 
$_SERVER['SERVER_ADDR'] 当前运行脚本所在的服务器的IP地址 
$_SERVER['SERVER_NAME'] 当前运行脚本所在服务器主机的名称。如果该脚本运行在一个虚拟主机上,该名称由那个虚拟主 机所设置的值决定 
$_SERVER['REQUEST_METHOD'] 访问页面时的请求方法。例如:“GET”、 “HEAD”、“POST”、“PUT”。如果请求 的方式是HEAD,PHP脚本将在送出头信息后中 止(这意味着在产生任何输出后,不再有输出缓 冲) 
$_SERVER['REMOTE_ADDR'] 正在浏览当前页面用户的IP地址 
$_SERVER['REMOTE_HOST'] 正在浏览当前页面用户的主机名。反向域名解析 基于该用户的REMOTE_ADDR
$_SERVER['REMOTE_PORT'] 用户连接到服务器时所使用的端口
$_SERVER['SCRIPT_FILENAME'] 当前执行脚本的绝对路径名。注意:如果脚 本在CLI中被执行,作为相对路径,如file.php 或者../file.php,$_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径
$_SERVER['SERVER_PORT'] 服务器所使用的端口,默认为“80”。如果 使用SSL安全连接,则这个值为用户设置的 HTTP端口
$_SERVER['SERVER_SIGNATURE'] 包含服务器版本和虚拟主机名的字符串
$_SERVER['DOCUMENT_ROOT'] 当前运行脚本所在的文档根目录,在服务器 配置文件中定义

上传文件相关配置

在php.ini中,定位到File Uploads项,完成 对上传相关选项的设置。 上传相关选项的含义如下: file_uploads:如果值是on,说明服务器支持文件上传;如果为off,则不支持。一般默认是支持的。
upload_tmp_dir:上传文件临时目录。
upload_max_filesize:服务器允许上传文件的最大值,以MB为单位。

全局变量$_FILES

元素名  说明 
$_FILES['filename']['name'] 存储上传文件的文件名。如text.txt、 title.jpg等 
$_FILES['filename']['size'] 存储文件大小,单位为字节 $_FILES['filename']['tmp_name'] 存储文件在临时目录中使用的文件名。 因为文件在上传时,首先要将其以临时文件的身份保存在临时目录中 
$_FILES['filename']['type'] 存储上传文件的MIME类型,MIME类 型规定各种文件格式的类型。每种 MIME类型都是由“/”分隔的主类型和 子类型组成的。例如:“image/gif”,主类型为“图像”,子类型为GIF格式的文件,“text/html”代表HTML格式 的文本文件 
$_FILES['filename']['error'] 存储了上传文件的结果。如果返回0, 则说明文件上传成功

bool is_uploaded_file ( string filename )
bool move_uploaded_file ( string filename, string destination )

上传文件的form表单,必须有enctype属性

enctype="multipart/form-data"

Ajax概述

AJAX是Asynchronous JavaScript And XML的缩写,即异
步JavaScript和XML。
不使用 AJAX,若要更新网页内容,必须重新从服务器加载
整个网页;
使用AJAX,可以异步在后台与服务器进行数据交换,并使
用服务器响应来更新部分网页。

XMLHttpRequest对象

AJAX使用JavaScript的XMLHttpRequest对象与服务器交互,所以使用AJAX处理网页请求主要包含创建XMLHttpRequest对象、发送请求、处理响应等

创建一个跨浏览器的 XMLHttpRequest对象
if (window.XMLHttpRequest) 
{   //Mozilla、Safari等浏览器 
	http_request = new XMLHttpRequest(); 
} 
else if (window.ActiveXObject) 
{   //IE浏览器 
    try 
    { 
        http_request = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e) 
    { 
        try 
        { 
        	http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
        } 
        catch (e) {} 
    } 
}

XMLHttpRequest对象的常用方法

open("method","URL"[,asyncFlag[,"userName"[, "password"]]])
send(content)
setRequestHeader("label", "value")
abort() getAllResponseHeaders()

XMLHttpRequest对象的常用属性

属 性 说 明
onreadystatechange 每次状态改变都会触发这个事件处理器, 通常会调用一个JavaScript函数 readyState 请求的状态。

responseText 服务器的响应,表示为字符串

responseXML 服务器的响应,表示为XML。这个对象可以解析为一个DOM对象

status 返回服务器的HTTP状态码

statusText 返回HTTP状态码对应的文本

XMLHttpRequest对象与服务器交互

Ajax与服务器的交互主要包括3个步骤:
(1)初始化XMLHttpRequest对象
(2)设置请求状态和返回处理函数

xmlobj.onreadystatechange=function_name;

(3)发送HTTP请求
xmlobj.open(send_method,url,flag);

xmlobj.send();

处理响应函数

function function_name()
{
    if (xmlhttp.readyState===4 && xmlhttp.status===200)
    {	
        //将处理结果显示在HTML页面中
        document.getElementById("nicknews").innerHTML=xmlhttp.responseText;
    }
}

PHP操作MySQL数据库

PHP操作MySQL数据库的方法

连接MySQL服务器

mysqli扩展提供了mysqli_connect()函数实现与MySQL数据库的连接

mysqli mysqli_connect ( string server , string username , string password , string dbname , int port , string socket )

选择MySQL数据库

bool mysqli_select_db ( mysqli link, string dbname )

执行SQL语句

mixed mysqli_query( mysqli link, string query , int resultmode )

将结果集返回到数组中

array mysqli_fetch_array ( resource result [, int result_type] )
MYSQL_ASSOC - 关联数组
MYSQL_NUM - 数字数组
MYSQL_BOTH - 默认。同时产生关联和数字数组

从结果集中获取一行作为对象 从结果集中获取一行作为枚举数组

mixed mysqli_fetch_row ( resource result )

从结果集中获取一行作为关联数组

mixed mysqli_fetch_assoc ( resource result )

获取查询结果集中的记录数

释放内存

void mysqli_free_result(resource result);

关闭连接

bool mysqli_close ( mysqli link )

连接与关闭MySQL服务器的最佳时机

会话控制

了解Session

SESSION通常是从注册进入系统到注销退出系统之间所经过的时间。

  • 通过SESSION来控制用户对页面的访问权限。
  • 防止非法用户绕过系统登录直接进入系统。
启动Session

启动Session使用的是session_start()函数。
bool session_start(void);

注册Session

会话变量启动后,全部被保存在全局数组$_SESSION[]中。

使用Session

将各种类型的数据 添加到Session中, 必须应用全局数组 $_ SESSION[]。

删除Session
  • 删除单个会话

    <?php unset ( $_SESSION['name'] ) ; ?>
    
    
  • 删除多个会话

    <?php session_unset(); ?>
    <?php $_SESSION = array();  ?>
    
    
  • 销毁Session

<?php session_destroy(); ?>

Cookie的操作

了解Cookie

Cookie文本文件的格式如下:
用户名@网站地址[数字].txt
Cookie常用于以下3个方面:

1.记录访客的某些信息。

2.在页面之间传递变量。

3.将所查看的Internet页存储在Cookies临时文件夹中,这样可以提高以后浏览的速度。

创建Cookie

创建Cookie应用的是setcookie()函数。

bool setcookie(string name[,string value[,int expire [,string path[,string domain[,int secure]]]]])

读取Cookie

在PHP中应用全局数组$_COOKIE[]读取客户端Cookie的值。
应用isset()函数检测Cookie变量

删除Cookie

方法有两种:
一种是使用setcookie()函数删除,
另一种是 在客户端手动删除Cookie。

创建Cookie数组
setcookie(string name[下标],string value,int expire,string path,string domain,int secure)

Cookie与Session的比较

Session与Cookie最大的区别是:

1)Session是将信息保存在服务器上,并通过一个Session ID来传递客户端的信息,服务器在接收到Session ID后根据这 个ID来提供相关的Session信息资源;Cookie是将所有的信息 以文本文件的形式保存在客户端,并由浏览器进行管理和维护。

2)Session为服务器存储,远程用户没办法修改Session文件内容。而Cookie为客户端存储,所以Session要比Cookie安全得多。

传统Session、Cookie有以下明显缺点:
1)Cookie的安全性不好,攻击者可以通过获取本地Cookie进行欺骗或者利用Cookie进行CSRF攻击;
2)使用Cookie时,在多个域名下,会存在跨域问题;
3)Session在一定的时间时,需要存放在服务器,因此当拥有大量用户时,也会大幅度降低服务端的性能;

面向对象基础

类和对象使用

定义类
创建对象,需先定义一个类。

  • 类是由class关键字、类名和成员组成的
  • 类的成员包括属性和方法
  • 属性是描述对象的特征,例如人的姓名、年龄等
  • 方法用于描述对象的行为,例如说话、走路等

$变量名=new 类名称([参数]);

在PHP中,类的封装是通过访问控制修饰符实现的,共有3种,分别为public(公有修饰符)、protected(保护成员修饰符)和private(私有修饰符)。

如果没有写关键字,那么默认就是public。

类的成员—成员常量

在类中定义常量使用关键字const。
const PI= 3.14159;
常量的输出不需要实例化对象, 直接由类名+常量名调用即可。
类名::常量名

类的成员—静态成员
在类中可使用static关键字声明静态属性和静态方法。

访问类中的成员
使用特殊的运算符号“->”访问类中的成员。

$变量名=new 类名称([参数]); 
$变量名->成员属性=值; 
$变量名->成员属性; 
$变量名->成员方法;

\(this” 操作符 使用\)this变量可以引用该对象的其他方法和 属性,并使用“->”作为连接符。

$this->属性名; 
$this->方法名;

注:使用$this变量不可以访问静态成员。

注:使用$this变量不可以访问静态成员。

:: 操作符

操作符“::”可以在没有声明任何实例的情况下访问类中的成员。
关键字::变量名/常量名/方法名
parent关键字:可以调用父类中的成员变量、成员方 法和常量。

self关键字:可以调用当前类中的静态成员和常量。

类名:可以调用本类中的变量、常量和方法。

  • 在类外部

使用“类名::静态成员名(常量)”格式来访问。

  • 在类内部

使用“self::静态成员名(常量)”格式访问。

构造方法(两个下划线加上construct)
function __construct([mixed args [,…]]){ //方法体 }
每个类都有一个构造方法,用于在创建对象时被自动调用。

  • 它主要用于在创建对象的同时,完成初始化功能
  • 若类中没有显式声明,PHP会自动生成一个无参且无任何操作的默认构造方法
  • 当在类中显式声明了构造方法时,默认构造方法将不存在

析构方法(两个下划线加上destruct)
function __destruct(){ // 方法体,通常是完成一些在对象销毁前的清理任务 }
将对象变量赋值为NULL,或用unset()函数删除变量 ,均可删除变量到对象的引用。
当对象的所有引用被删除、对象被显式销毁、执行exit() 结束脚本或者脚本执行结束时,析构函数会被调用。

面向对象的继承

继承关键字extends

子类调用父类的成员方法
通过parent::关键字可以在子类中调用父类中的成员方法。
parent::父类的成员方法(参数);

覆盖父类方法(重载)
覆盖父类方法就是在子类中创建与父类中相同的方 法,包括方法名称、参数和返回值类型。
如果父类和子类中都定义了构造方法, 当子类的对象被创建后, 将调用子类的构造方法, 而不会调用父类的构造方法。

抽象类

抽象类使用abstract关键字来声明。

abstract class 抽象类名称

{ 	//抽象类的成员变量列表 

    abstract function 成员方法1(参数); 

    abstract function 成员方法2(参数); 

}

接口

接口类通过interface关键字来声明。

interface 接口名称
{ 
    // 常量成员 
    // 抽象方法; 
}
interface One
{ 
    const CONSTANT='CONSTANT value';
    function FunOne(); 
} 
echo One::CONSTANT;

接口

接口中所有的方法都是抽象的,因此声明时省略 abstract关键字

接口的方法体没有具体实现

在接口中,所有的方法只能是公有的

需要通过某个类使用implements关键字来实现接口。

一个类也可以在继承的同时实现接口:

class MobilePhone extends Phone implements ComInterface 
{ 
	// 该类继承了Phone类并实现了ComInterface接口 
}

面向对象的多态

通过接口实现多态

定义接口Type,并定义一个空方法go_type()。

然后定义Type_car和Type_Bus子类继承接口Type。

最后通过 instanceof关键字检查对象是否属于接口Type。

面向对象的其他

final关键字

被final修饰过的类不能被继承 被final修饰过的方法在子类中不可以进行重写,也不可以被覆盖。
final
class class_name{ final function method_name() }

clone关键字

对象的克隆可以通过关键字clone来实现。
$克隆对象名称=clone $原对象名称;

魔术方法“__clone()”可以为克隆后的副本对象重新初始化。

它不需要任何参数,其中自动包含\(this和\)that两个对象的引用。

instanceof关键字

instanceof操作符可以检测当前对象是属于哪个类。
ObjectName instanceof ClassName

魔术方法

__set()和__get()方法
__isset()和__unset()方法
__call()方法

__toString()方法
__autoload()方法

__set()方法:在程序运行过程中为私有的成员属性设置值 ,它不需要任何返回值。

__get()方法:在程序运行过程中,在对象的外部获取私有 成员属性的值。

bool __isset(String name)
bool __unset(String name)

__call()方法

__call()方法的作用是:当程序试图调用不存在或不可见的 成员方法时,PHP会先调用__call()方法来存储方法名及 其参数。

__toString()方法
魔术方法__toString()的作用是:当使用echo或 print输出对象时,将对象转化为字符串。
(1)如果没有__toString()方法, 直接输出对象将会发生致命错误(fatal error)。 (2)输出对象时应注意,echo或print函数后面直 接跟要输出的对象,中间不要加多余的字
符。

__autoload()方法

__autoload()方法可以自动实例化需要使用的类。

PDO操作数据库

PHP 5.1可使用轻量级的统一接口PDO(PHP Data Object, PHP数据对象)来访问各种常见的数据库。而使用PDO只需要指 定不同的DSN(数据源名称)即可访问不同的数据库。

首先需要在 php.ini文件中启用设置:
extension=php_pdo.dll:启用PDO扩展库。
extension=php_pdo_mysql.dll:启用MySQL扩展库。

记录查询
(1)使用query()方法执行查询
query()方法参数为一个查询字符串,查询执行成功返回包 含查询结果集的PDOStatement对象,若失败则返回FALSE。
提示: 若查询结果集中记录没有读取完,试图再次执行query()方法将会出错。此 时,可在再次执行query()方法前,调用PDOStatement的closeCursor()方法释 放PDOStatement对象关联的数据库资源。
(2)使用预处理查询
如果一个查询需要多次执行,则可使用PDO对象的prepare() 方法预先提交查询,服务器准备一个预处理查询语句。然后可多 次调用PDOStatement对象的execute()方法执行查询。
查询执行成功返回包含查询结果集的PDOStatement对象,若 失败则返回FALSE。
准备好语句后,调用execute()方法执行查询。
(3)使用带参数的预处理查询
在预处理查询过程中可对其参数进行设置,分别是使用问号 参数、使用命名参数和将参数绑定到变量(:参数名,以冒号开 始的参数名)3种方式设置参数。
① 使用问号参数
② 使用命名参数
③ 将参数绑定到变量
可以将参数绑定到变量,变量的值作为参数值。
如果参数不是命名参数,在绑定时,可使用1开始的整数表 示对应参数。

处理查询结果集
不管用query()方法还是execute()方法执行查询操作,查 询结果都保存在PDOStatement对象中。可用PDOStatement 对象的fetch()、fetchAll()或fetchColumn()方法从查询结果 中集中读取数据。
(1)使用fetch()方法读取查询结果
fetch()方法返回一个包含查询结果集下一条记录的数据,已无记录时返回 FALSE。其基本格式为
(2)使用fetchAll()方法读取查询结果
fetchAll()方法指返回查询结果集中剩余的全部记录到一个二维数组,无 记录时返回FALSE。其基本格式为
(3)fetchColumn()方法读取查询结果
fetchColumn()方法返回查询结果集下一条记录中指定列的值,已无记 录时返回FALSE。其基本格式为

错误处理及调试

常见的错误类型

大致可以分为以下4类

  • 语法错误
  • 运行错误
  • 逻辑错误
  • 环境错误

语法错误:是指编写的代码不符合PHP的编写规范。
特点:语法错误最常见,也最容易修复
例如:遗漏了一个分号,就会显示错误信息这类错误会阻止PHP脚本执行,通常发生在程序开发时,可以通过错误报告进行修复,再重新运行检查。

运行错误:一般不会阻止PHP脚本的执行,但会导致程序出现潜在的问题。
例如:在一个脚本中定义了两次同名常量,PHP通常会在第二次定义时提示一条错误信息。虽然PHP脚本继续执行,但第二次定义常量的操作没有执行成功。

逻辑错误:最让人头疼,不但不会阻止PHP脚本的执行,也不会显示出错误信息
例如:在if语句中判断两个变量的值是否相等,如果错把比较运算符“==”写成赋值运算符“=”就是一种逻辑错误,很难被发现。

环境错误:是由于PHP开发环境配置的问题引起的代码报错
例如:用mb_strlen()这个函数时,如果PHP环境中没有启用mbstring扩展,就会导致程序出错。

错误级别

PHP中的每个错误都有一个错误级别与之关联,用于表示当前错误的等级。
例如Error、Warning、Notice等错误。
PHP采用常量的形式来表示错误级别,每个错误级别都是一个整型。

级别常量 描述
E_ERROR 1 致命的运行时错误,这类错误不可恢复,会导 致脚本停止运行
E_WARNING 2 运行时警告,仅提示信息,但是脚本不会停止 运行
E_PARSE 4 编译时语法解析错误,说明代码存在语法错误, 无法执行
E_NOTICE 8 运行时通知,表示脚本遇到可能会表现为错误 的情况
E_CORE_ERROR 16 类似E_ERROR,是由PHP引擎核心产生的
E_CORE_WARNING 32 类似E_WARNING,是由PHP引擎核心产生的
E_COMPILE_ERROR 64 类似E_ERROR,是由Zend脚本引擎产生的
E_COMPILE_WARNING 128 类似E_WARNING,是由Zend脚本 引擎产生的
E_USER_ERROR 256 类似E_ERROR,由用户在代码中使 用trigger_error()产生的
E_USER_WARNING 512 类似E_WARNING,由用户在代码中 使用trigger_error()产生的
E_USER_NOTICE 1024 类似E_NOTICE,由用户在代码中使 用trigger_error()产生的
E_STRICT 2048 严格语法检查,确保代码具有互用性 和向前兼容性
E_DEPRECATED 8192 运行时通知,对未来版本中可能无法 正常工作的代码给出警告
E_ALL 32767 表示所有的错误和警告信息(在PHP 5.4之前不包括E_STRICT)

遇到Notice提示信息通常是代码不严谨造成的,不会影响脚本继续运行。
Warning错误级别相比Notice更严重一些,不会影响脚本继续执行。
Fatal error是一种致命错误,在运行时发生。一旦发生该错误,PHP脚本会立即停止执行。
Parse error是语法解析错误,当脚本存在语法错误时,无法解析成功,
就会发生此错误。遇到此错误说明脚本没有执行。

手动触发错误
bool trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] )
第1个参数是错误信息内容
第2个参数是错误类别,默认为E_UESR_NOTICE

显示错误报告-修改配置文件

直接配置php.ini文件来显示错误报告。
error_reporting = E_ALL & ~E_NOTICE
display_errors = On
error_reporting用于设置报告的错误级别
display_errors用于设置是否显示错误信息
第1行代码中E_ALL & ~E_NOTICE表示报告除E_NOTICE之外的所 有级别的错误
第2行表示将错误报告显示在输出结果中

显示错误报告-error_reporting()和ini_set()函数

通过PHP提供的error_reporting()和ini_set()函数来实现显示错误报告。
error_reporting(E_ALL & ~E_NOTICE); ini_set('display_errors', 1);
ini_set()函数用来设置php.ini中指定选项的值,仅在本脚本周期内有效
error_reporting()函数用于设置错误级别
若要获取php.ini中的指定选项值,可以使用ini_get()函数进行获取

如何处理错误

记录错误日志

错误日志功能

实现方式:
通过配置文件来记录错误日志信息

记录错误日志-修改配置文件

通过修改php.ini配置文件,可以直接设置记录错误日志的相关配置项

error_reporting用于设置显示错误级别
E_ALL表示显示所有错误

log_error用于设置是否记录日志
error_log用于指定日志写入的文件路径

error_reporting = E_ALL 
log_error = On 
error_log = C:\web\php_errors.log

通过error_log()函数来记录错误日志信息。
error_log()函数用于将错误记录到指定的日志文件中
// 将错误信息发送到php.ini中的error_log配置的日志中

error_log('error message a');

// 将错误信息发送到指定日志文件中

error_log('error message b', 3, 'C:/web/php.log');

第2个参数用于指定将错误信息发送到何处,当省略时默认为 php.ini中的error_log配置的日志中,此处设置为3,表示发送到 指定的日志文件中。

第3个参数的设置取决于第2个参数,此处表示日志文件的路径

PHP的调试工具

PHP调试工具Xdebug
作用:是一个开放源代码的PHP程序调试器,用来调试和分
析程序的运行状况。
将下载好的php_xdebug-2.3.3-5.5-vc11.dll文件放到PHP的ext目录中
然后在php.ini文件中添加配置信息,引入该扩展即可。

[Xdebug] 
zend_extension="C:\phpStudy\PHPTutorial\php\php5.5.38\ext\php_xdebug2.3.3-5.5-vc11.dll"

重启Apache服务使php.ini配置生效。为了验证是否安装成功, 可以通过phpinfo()函数查看配置信息。如果在页面中看到 Xdebug信息,说明Xdebug安装成功。

推荐阅读