PHP基础语法
PHP在HTML中的嵌入,允许四种类型
<?php
和?>
,只要支持PHP语言的服务器。<?
和?>
,需将php.ini
文件中的short_open_tag
的值设为on
。<script language ="php">
和</script>
<%
和%>
,在PHP3.0.4及其以上版本,需将php.ini
文件中的asp_tags
的值设为on
。
三种注释方法
1
2
3
4
5
6//注释内容...
# 注释内容...
/*
多行注释
注释内容...
*/输出命令
- echo:无返回值,不能用于复杂语句。
- print:有返回值,负责为用户提供反馈,能显示原始字符串和变量,提供与echo相同的功能,且比echo语句更强大。
- print_r
- 区分大小写
- 区分大小写的时候:
- 变量名
- 常量名,通常写成大写
- 不区分大小写的时候:
- 函数名、方法名、类名,在调用时尽量使用和定义时相同的名字;
- 魔术常量不区分大小写,如 LINE,FUNCTION等;
- NULL,TRUE,FLASE不区分;
- 类型转换时,如(string) 和(STRING)是相同的;
- 区分大小写的时候:
数据类型
数据类型是语言最为基础的部分,它是高级语言抽象出来的一个概念,对于低级语言(机器语言)没有这个概念。对于CPU、内存而言,并没有数据类型之分,数据是没有差别的,高级语言的数据类型为内存中的数据指定了特定的计算方式。
数据类型的产生使得程序的编写更加规范、简洁和灵活。
- 数据类型:
- 标量类型:字符串、整型、浮点型和布尔型;
- boolean(或为bool)
- integer(或为int)
- float
- string
- 复合类型:数组和对象;
- array
- object
- 特殊类型:资源和NULL。
- 标量类型:字符串、整型、浮点型和布尔型;
数据类型的方法:
1
2
3
4
5
6
7
8
9
10
11// 判断数据类型的方法
is_bool()/is_int()/is_float()/is_string()/is_array()/is_object()
// 数据类型的转换方式
// 在变量前加上用括号括起来的数据类型
(int)/ (bool)/ (float)/ (string)/ (array)/ (object)
// 使用3个具体类型的转换函数
intval()/floatval()/strval()
// 使用函数
settype(var, type)
// 判断变量是否为数字或者数字组成的字符串。
is_numeric()注意:如果给定的数超过了int的范围,将会解释为float,同样,如果执行的运算结果超过int范围,也会返回float。
进制表示
1
2
3
4$a = 123;//十进制数
$a = 0123;//八进制数
$a = 0x1A;//十六进制数
$a = 0b11111111;//二进制数字字符串中特殊字符
字符形式 | 功能
—|—
\n | 换行且归0
\br | 换行
\t | 跳格
\’ | 单引号
\” | 双引号
\$ | $符号
\r | 回车NULL:表示变量没有值,下列情况变量被认为是NULL:
- 被赋值为NULL;
- 尚未被赋值;
被unset()。
NULL大小写敏感。
变量
定义:变量可以看做是一个容器,先给容器取个名字,然后利用赋值运算符给这个容器装上内容。变量是最常见的数据类型应用形式,主要由变量名、变量值和变量类型三部分组成。
内部实现:PHP中变量名与变量可以简单地对应为zval和zend_value。PHP通过zval结构体来表示一个变量,不同类型的变量值则通过zval内嵌入一个联合体表示,即
zend_value
。通过zval
、zend_value
及不同类型的结构实现了PHP基础的数据类型。zval的作用:(1)PHP变量;(2)统一函数的参数
变量的命名规则
- 必须以$符号开头;
- 第二个字符必须是字母或者下划线;
- 第二个字符以后的可以是字符数字等的任意组合。
默认变量
变量名 | 意义 |
---|---|
PHP_SELF | 目前执行的文件名称 |
SERVER_NAME | 服务器名 |
SERVER_SOFTWARE | 服务器软件 |
DOCUMENT_ROOT | 文档的根目录 |
HTTP_USER_AGENT | 用户相关信息 |
REMOTE_ADDR | 远程用户的地址 |
REMOTE_PORT | 远程用户的连接端口 |
在取得变量内容时,以变量名称为数组指针即取得信息。例如SERVER_NAME可以用$_SERVER[‘SERVER_NAME’]取得信息。
常量
定义:常量就是简单值的标识符(名字),代替一个有意义的值。常量如同其名称所暗示的,在程序执行期间该值不能改变。PHP的变量包含两种:一种默认常量,另一种的自定义常量。
默认常量
变量名 | 意义 |
---|---|
_FILE_ | 当前正在分析着的脚欧诺个在分析一个被include或require包含的文件,则该常数给出的是include所包含的文件名,而不是当前文件名。 |
_LINE_ | 当前正在分析着的行在脚本的行数。如果用在一个被include或require的文件中,则该常数给出的是(行)在被include包含的文件中的位置。 |
PHP_VERSION | 一个描述当前用着的PHP处理器的版本的字符串 |
PHP_OS | 正在运行本PHP处理器的操作系统的名字 |
TRUE | 真值 |
FALSE | 假值 |
E_ERROR | 指示一个不可恢复的语法错误 |
E_WARNING | 指示如下一种状态:PHP指导某处出错了,但仍可以继续运行;这些错误能被脚本自身捕获 |
E_PARSE | PHP在脚本的一个语病中被阻塞,不可恢复 |
E_NOTICE | 出现了可能是一个错误也可能不是的情况:(这种情况下)运行会继续 |
这些系统变量可以帮助我们很好地了解系统当前的情况,而且这些常量可以随时调用。
- 自定义常量:通过
define('name',number)
函数自定义需要的常量。
运算符及表达式
- 算术运算符
运算符 | 名称 | 结果 |
---|---|---|
$a + $b | 加法 | $a 和 $b 的和 |
$a - $b | 减法 | $a 和 $b 的差 |
$a * $b | 乘法 | $a 和 $b 的积 |
$a / $b | 除法 | $a 除以 $b 的商 |
$a % $b | 取模 | $a 除以 $b 的余数 |
++$a | 前加 | $a 的值加一,然后进行操作 |
$a++ | 后加 | $a 的值先进行操作,后加一 |
–$a | 前减 | $a 的值减一,然后进行操作 |
$a– | 后减 | $a 的值先进行操作,后减一 |
- 比较运算符
运算符 | 名称 | 结果 |
---|---|---|
$a == $b | 等于 | TRUE,如果$a等于$b |
$a === $b | 全等 | TRUE,如果$a等于$b,并且它们的类型也相同 |
$a != $b | 不等 | TRUE,如果$a不等于$b |
$a <> $b | 不等 | TRUE,如果$a不等于$b |
$a !== $b | 非全等 | TRUE,如果$a不等于$b,或者它们的类型不同 |
$a < $b | 小于 | TRUE,如果$a严格小于$b |
$a > $b | 大于 | TRUE,如果$a严格$b |
$a <= $b | 小于等于 | TRUE,如果 $a 小于或等于$b |
$a >= $b | 大于等于 | TRUE,如果 $a 大于或等于$b |
另外一个条件运算符是“ ? : ”(或三元)运算符。
- 逻辑运算符
运算符 | 名称 | 结果 | ||
---|---|---|---|---|
$a and $b | 逻辑与 | TRUE,如果 $a 与 $b 都为 TRUE。 | ||
$a or $b | 逻辑或 | TRUE,如果 $a 或 $b 任一为TRUE。 | ||
$a xor $b | 异或 | TRUE,如果 $a 和 $b 不同时 | ||
! $a | 逻辑非 | TRUE,如果 $a 不为 TRUE。 | ||
$a && $b | 逻辑与 | TRUE,如果 $a 与 $b 都为TRUE。 | ||
$a | $b | 逻辑或 | TRUE,如果 $a 或 $b 任一为TRUE。 |
其中and与&& 、or与||是同一逻辑运算符的两种写法。
位运算符
位运算符允许对整型数中指定的位进行置位。如果左右参数都是字符串,则位运算符将操作字符的 ASCII 值。
表达式 | 名称 | 结果 | |
---|---|---|---|
$a & $b | 按位与 | 将把 $a 和 $b 中都为 1 的位设为 1。 | |
$a | $b | 按位或 | 将把 $a 或者 $b 中为 1 的位设为 1。 |
$a ^ $b | 按位异或 | 将把 $a 和 $b 中不同的位设为 1。 | |
~ $a | 按位非 | 将 $a 中为 0 的位设为 1,反之亦然。 | |
$a << $b | 左移 | 将 $a 中的位向左移动 $b 次(每一次 移动都表示“乘以 2”)。 | |
$a >> $b | 右移 | 将 $a 中的位向右移动 $b 次(每一次 移动都表示“除以 2”)。 |
字符串运算符
- 连接运算符(“.”),它返回其左右参数连接后的字符串。
- 连接赋值运算符(“.=”),它将右边参数附加到左边的参数后。
错误抑制操作符
- 在最常见的数据库连接与文件创建操作或出现除0等异常时,可以用@符号来抑制函数错误信息输出到浏览器端 $a=@(5/0)
- 外部命令执行 ,使用``来运行外部系统命令,注意不是单引号,是ESC下面那个按键
常用的控制流
if语句
简单的if语句
1
2
3if(判断语句) {
执行语句体;
}if…else语句
1
2
3
4
5if(判断语句) {
执行语句体1;
} else {
执行语句体2;
}嵌套if…else语句
1
2
3
4
5
6if(判断语句) {
执行语句体1;
} else if(判断语句2) {
执行语句体2;
} else if...
else...
switch语句(多分支选择性语句)
表达式:
1
2
3
4
5
6switch(表达式) {
case 1: 执行语句体1;break;
case 2: 执行语句体2;break;
...
default:执行语句体n;break;
}switch后面括号内的表达式,可以是整型表达式或字符型表达式,也已是枚举型数据。表达式的值与case语句后面的值逐个进行匹配,如果匹配得上,就执行case语句后面执行语句体,然后通过break跳出该循环。如果最终没有case语句匹配的表达式,则执行default后面的执行语句体。(default后面可以不加break)。
while循环
while语句
1
2
3while(判断语句) {
执行体语句;
}do…while语句
1
2
3do {
执行体语句;
}while(判断语句)
for循环
for语句
1
2
3for(表达式1,表达式2,表达式3) {
执行语句体;
}
break、continue语句
break:具有结束、中断整个循环的作用,可以被用到for、do…while等循环中,起到结束循环的作用。实际上break语句还可以用来从循环体内跳出循环,即提前结束循环,接着执行其他语句。
continue:起到结束本次循环,执行下次循环的作用。
常用函数
输出函数
1 | echo() //【语言结构】 |
数组函数
排序类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 按V,按元素值
sort
rsort
asort
arsort
//按K,按键值
ksort
krsort
//按字母
natsort(); //区分大小写的排序
natcasesort(); //不区分大小写的排序,
// 回调
usort($arr,"strnatcmp")//回调类的排序,把$arr数组里的每一个元素丢到strnatcmp()[非自然数排序]处理【返回新的排序数组】规律:
- 没有”k”,排序按照【value】排序,排序有”a”的表示要保留KEY,有”r”的倒序排
- 有“k”,排序按照【KEY】排序,有”r”的倒序排
- 有”u”的,表示要丢到回调函数中处理的
键值操作
1
2
3
4
5
6
7
8
9
10
11
12
13array_values($arr);//获取$arr中的值重排,去掉下标【返回值新索引数组】
array_keys($arr[,"str",true])//获取$arr中所有字符是"str"的下标,形成索引数组,true表示区分大小写【返回新索引数组】
array_search("is",$arr[,true]) //返回值"is"在$arr中的key,找不到返回fales,true表示严格按照类型(8,"8")【返回第一个匹配值】
in_array("str",$arr);//判断"str"在$arr中是否存在,【返回BOOL】
is_array($arr);//判断是否是数组【返回BOOL】
array_key_exists($key,$arr); //查询$arr中是否有$key,【返回BOOL】
array_flip($arr);// 交换键值,如有重复,后来居上,【返回新数组】
array_reverse($arr,[true|false]);//数组顺序反转,param2是否保留原来键值【返回新关联/索引数组】
array_column(array(),'name'[,name_two]) — 返回数组中指定的name列[可选参数,如果有返回name=>name_two的形式]【返回一维数组】元素个数和唯一性
1
2
3
4array_unique($arr);//去掉$arr中的重复值,重复的保留第一个值,【返回数组,键值保留】
array_count_values($arr)//统计数组值出现的次数,【返回数组,KEY为原来数组的值,VALUE为统计的次数】
count($arr[,1])/sizeof();//统计$arr的元素个数,参数"1"表示统计多维数组开启,默认0为关闭【返回统计个数】回调函数
1
2
3
4array_filter($arr,"function");//把$arr放到函数function中处理,【返回判断为TRUE的数据组成新数组,键值保留】
array_walk($arr,"function"[,"data"]);//把$arr放到function(&$v,$k,$data)中处理【返回值为bool】
array_map("function",$arr,$arr2,$arr3,....);//把所有数组返回到回调函数统一处理,【返回数组】
array_reduce($arr,myfunction[,initial]):把一维数组$arr中的值依次传到自定义函数myfunction($v1,$v2)的v2上,v1为累加值类似于( .= ),[如果有initial,先把其当v1传进去]【返回字符串】拆分,合并,分解,接合数组
1
2
3
4
5
6
7
8
9
10
11array_slice($arr,1[,2]);//在$arr中,从第二个开始取[,返回俩个值]【返回新数组(对原数组无影响),键值保留】
array_splice($arr,1[,2,"aaa","bb"]);//删除或替换,从$arr第二个开始取,删除或替换2个值【返回值为新数组,拆掉原数组】
array_combine($arr1,$arr2);//数组$arr1为KEY,$arr2为VALUES结合形成新索引数组【返回索引数组】
array_merge($arr1,$arr2,$arr3...);//数组进行合并,保留键值,有重复后来者居上(取后者)【返回新数组】
$arr1+$arr2 // 发现有key值相同的,取前者,第二个重复的值丢弃
array_intersect($arr1,$arr2)//返回两个数组的交集,键值不变
array_diff($arr1,$arr2)//返回两数组的差集,返回的值为第一个数组的值,键值不变
array_chunk($arr,2)//分割数组,把$arr按照【2个为一组】均等分割【返回一个二维数组】数组的数据结构【2.无返回值,传值引用,就直接对原数组进行了修改】
1
2
3
4
5
6
7
8
9
10
11
12
13array_shift($arr)//从开头,删除数组第一个元素
array_unshift($arr,"one","two")//从开头,添加元素
array_pop($arr)//从结尾,删除数组最后一个元素
array_push($arr,"aaa");//从结尾,添加元素
current($arr)//返回数组中的当前单元 比如是关联数组是不知道下标,可以输出当前数组的办法解决
key($arr)//返回当前指针指向元素的键值
next($arr)//当前指针下移
pre($arr)//当前指针上移
end($arr)//指针指到最后
reset($arr)//指针回归到开头
unset($arr)//销毁此数组其他
1
2
3
4
5array_rand($arr,2);//随机返回两个$arr数组当中的key【返回值为值或者数组】
shuffle($arr)//随机的重组$arr,顺序变乱【返回新数组,保留键值】
array_sum($arr);//返回$arr的value的和【返回一个值】
range(0,10,2,)//快速创建0,10的数组,间隔为2,所以有5个值【返回新索引数组】
http_build_query($arr)//把关联数组转换成一个经过urlencode加密的URL eg:array["a"=>2];=>URL:a=2&
字符串函数
返回bool
1
2isset($a) //当$a=NULL 或不存在,返回false,反之为true
empty($a) //当$a=NULL/''/array()/0/'0'/不存在时 返回true,反之为false返回值为自字符
1
2
3
4
5
6
7substr(字符串,开始地方,[返回字符串的长度]); // 截取字符串的一部分,第一个字符位置为0
substr_replace($str,"aaa",start[,length]); // 在$str上操作,从第start个开始,把【后边】的字符[全/或length个]替换
sub_count($str,"is"[,5,10]); //[ 从第五个字符开始,搜索长度为10,]搜索is在$str中出现的次数,【返回次数】
strstr($email,"@"[,true]) //从头开始搜索,无true返回@后边字符,有true返回@前边的字符[strrchr对比]
strrchr($email,"@") //从结尾开始搜索,返回@后的所有字符
str_replace(被替换词,替换词,被搜索字符串,[统计替换次数$num]) //前两个参数也可为数组,两个数组元素个数相同
str_repeat($str,num); //重复$str字符串 num次,返回值为数字类的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// 定位
strpos($str,"@"); //返回@【第一次出现的位置】
strrpos($str,"@"); //返回@【最后一次出现的位置】
//统计
strlen($string);成功则返回字符串 $string 的长度
mb_strlen($string,'utf8');//获取字符串$string长度,多字节的字符被计为 1。
str_word_count($str[,0/1/2]); //返回$str中单词的数量[0指返回次数,默认值/1指以数组形式返回单词值/2指返回关联数组,k为单词首字母下标,v单词值]
//以下四个比较函数,【返回值:相等0,小于-1,大于1】
strcmp($str1,$str2); //按ASCII码比较 str1>str2 则返回1 相等返回0 <返回-1
strcasecmp //比较两个字符串(不区分大小写),函数是二进制安全的。类似于strncasecmp(),但是strncasecmp可以指定每个字符串用于比较的字符数。
strnatcmp($str1,$str2); // 使用"自然"算法来比较两个字符串(区分大小写)
strnatcasecmp($str1,$str2); // 使用一种"自然"算法来比较两个字符串(不区分大小写)
number_format(10000[,2]);
//==》10,000.00 把第一个参数格式化,保留2位小数在自然算法中,数字 2 小于数字 10。在计算机排序中,10 小于 2,这是因为 10 中的第一个数字小于 2。
文本处理类
1
2
3
4
5
6
7
8
9
10
11strtoupper($str) //字母全转为大写【返回全大写字符串】
strtolower() //字母全转为小写【返回全小写字符串】
ucfirst() //整个$str首字母大写
ucword() //$str每个单词首字母大写
strtotime('2015-10-10 10:10:10'); //指定时间转换为时间戳【返回时间戳】
str_pad($str,length,[---,STR_PAD_BOTH]); //在$str的两边填补“---“,注意,length若小于$str长度,不填补
trim($str[,"a",STR_PAD_BOTH]) //去除两边/左/右的空白或"a",默认是空白,或自定义字符
floatval("123.45aa") //=》获取变量的浮点值【123.45】HTML类处理
1
2
3
4
5
6
7
8
9
10
11htmlspecialchars($str) //函数把【预定义字符】转换为【 HTML 实体】,&转换成&
htmlspecialchars_decode($str); //把【HTML实体】转换成【预定义字符】,&转换成&
htmlentities($str); //函数把【预定义字符】转换为【 HTML 实体】,&转换成&,有乱码问题,注意第二第三个参数,若编码不正确,会在实体化时把信息丢失。
html_entity_decode($str); //把【HTML实体】转换成【预定义字符】,&转换成&, > 转成 <
addslashes($html); //添加转义字符“/”
stripslashes($html); //删除转义字符“/”
strip_tags($html); //去除HTML标签
nl2br($str); //在$str中的换行/n前插入<br>,因为\n在源码可以换行,但是在浏览器窗口不行,有这个就可以
iconv( from_charset ; to_charset,$str); //转化字符格式,如$file_name = iconv("gb2312","utf-8",$file_name);
正则函数
字符串的匹配查找
1
2
3
4preg_match($pattern,$subject,$arr); //按正则$pattern处理$subject,第一次匹配结果返回到数组中【函数的返回值为匹配次数】
preg_match_all($pattern,$subject,$arr) //按正则$pattern处理$subject,全部匹配结果返回到数组中【函数的返回值为匹配次数】
strstr($str,"@"[,true]);
strpos,strrpos,substr($str,position) //联合使用字符串的替换
1
2preg_replace($pattenr,$replace,$str);//【强大的字符串处理函数】在$str中,把$parrern匹配的值替换成$replcae【返回值为处理后的字符串】
str_replace($str,"aaa","bbb");//把$str中的aaa换成bbb字符串的分割和链接
1
2
3preg_split($pattern,$str);通过一个正则表达式分隔字符串【返回值为数组】
explode(",",$str[,$limit_num]);//把$str按照","分割成一个数组[可选参数为返回数组的元素个数]【返回一个分割后的数组】
impolde("+",$arr);//把$arr里的元素按照“+”链接成一个字符串
1
2
3
// 示例
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
// 结果Array([0] => hypertext,[1] => language[2] => programming)
遵循:能用字符串函数解决不用正则的原则,主要依据是速度问题,内部函数快于正则。
数学函数
1 | ceil()//向上取整 |
时间函数
1 | date_default_timezone_set()('PRC');//设置时区为中国 |
JSON
1 | json_encode($data);//对变量进行JSON编码 |
SQL函数
1 | mysql_connect('localhost',"root","root"); //连接数据库 |
URL处理函数
1 | urlencode($url) //对该URL进行编码;原因:防止乱码,解决空格的呢个字符不能传递问题,form也是此编码格式传递 |
其他函数
1 | sleep(10)//脚本执行到这里后,延迟10秒继续执行 |
当序列化对象时,PHP 将试图在序列动作之前调用该对象的成员函数 sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用 wakeup() 成员函数
参考: