前言
php的语法跟C语言很类似,相信有一定C的基础的人学起来会非常快。
本篇主要介绍php相比C语言有差异的地方
php代码标记
ASP标记:<% 代码 %>
短标记:<? 代码 ?> 前两种基本弃用
脚本标记:<script language="php"> 代码 </script>
标准标记:<?php 代码 ?> <常用>
很多php代码不是嵌入到html中的,?>建议不使用,会自动认为后面都是php代码。不用传递多余的空格
变量
删除变量
unset($var); //用于释放内存
预定义变量:都是数组
$_GET: 获取所有表单以get方式提交的数据
$_POST: 获取所有表单以post方式提交的数据
$_REQUEST: GET和POST提交都会保存
$GLOBALS: PHP中所有全局变量
$_SERVER: 服务器信息
$_SESSION: session会话数据
$_COOKIE: cookie会话数据
$_ENV: 环境变量
$_FILES: 用户上传的文件信息
可变变量
变量保存的值正好是另外一个变量的名字,可以通过访问一个变量得到另一个变量的值,类似指针的功能。
变量前面两个$$
$a='b';
$b='bb';
$$a-->'bb'
变量存储
代码装载:从脚本中读取代码,编译,编译的结果放到代码段
代码执行:从代码段中一行行执行
在栈区开辟内存储存变量$a,数据段中开辟一块内存保存值,将数据所在的位置赋值给变量
引用传值 : $b=&$a
常量:通常大写,不需要$
两种定义方法:
define('PI', 3.14);
const PI = 3;
用define定义可以使用一些特殊字符,“-_-”
两种定义方法,访问权限有区别
define第3个参数,可以控制大小写不敏感
访问echo constant(''-_-'');
系统常量
PHP_VERSION
PHP_INT_SIZE
PHP_INT_MAX
魔术变量
__DIR__
__FILE__
__LINE__
__NAMESPACE__
__CLASS__
__METHOD__
数据类型
PHP是弱类型语言,变量本身没有数据类型
3个大类8个小类
- 简单数据类型:
整型:int/integer,4个字节,
浮点型:float/double,8字节,表示小数或者整型存不下的整数
字符串类型:string,系统根据实际长度分配
布尔类型:bool/boolean,
- 复合数据类型
对象类型:object
数组类型:array
特殊数据类型
- 资源类型:resource,存放资源数据(PHP外部数据,如数据库,文件)
空类型:NULL
类型转换
转布尔
除了本身为0,变量未定义或者为空,其他都为TRUE
转数值
字符串转数值:
以字母开头的永远为0,
以数字开头的,取到碰到字母为止(不会同时两个小数点)
强制转换
括号里加类型,转NULL用unset()
类型判断
is_XXX, boolean类型不能echo,用var_dump(is_int($a));
gettype(变量名)
settype(变量名,类型)
强制类型转换,对数据值复制的内容进行处理(不会处理实际存储的内容)
settype会直接改变数据本身
进制转换
0b开头2进制,0开头8进制,0x开头16进制
decbin, decoct, dechex, bindec, binoct, binhex
判断
empty(): 0, false, 空, null, 未定义
is_null: null,未定义
isset(): 跟is_null相反
== 值相同即可
=== 类型和值都要相等
其他语法
字符串连接:. .=
错误抑制符:在可能出错的表达式前加@,通常在生产环境会用到
php嵌套在html中使用时,替代语法
<table border=1>
<?php for($i = 1; $i<10; $i++){ ?>
<tr>
<?php for($j=1;$j<10;$j++) {?>
<td>
<?php echo $i . '*' . $j . '=' . $i * $j; ?>
</td>
<?php }?>
</tr>
<?php }?>
</table>
php书写到html中非常不美观,php提供了一种替代机制,可以不用大括号
<?php for(;;): ?>
<?php endfor; ?>
条件和循环操作都有替代语法
左大括号用:替代
右大括号用end+对应操作;替代
系统常用函数
输出
print(): 本质是一种结构,不是函数,返回1,可以不需要括号
print_r(): 比var_dump简单,只会输出值(一般用于打印数组)。
时间
date(): 按照指定的格式输出时间,默认当前时间(1970开始的秒数)
time(): 获取当前时间对应的时间戳
mircotime(): 获取微秒级别的时间,+时间戳
strtotime(): 指定格式的时间字符串转成时间戳
数学
max(), min(), rand(), mt_rand()效率更高, round(), cell(), floor(), pow(), abs(), sqrt()
有关函数的函数
function_exsits();//函数是否在内存中存在
func_get_arg(); //获取指定的参数
func_get_args(); //获取所有的参数,数组
func_num_args(); //获取参数的个数
文件包含
include或require直接将代码在当前位置嵌入,被包含的文件是单独进行编译的。
php文件在编译的过程出现语法错误,会失败,不会执行。但是被包含的文件有错误时,在执行到包含include这条语句时才报错。
include和require的区别
include_once系统只会执行一次
包含不到文件时,报错的形式不一样。require如果包含出错,代码不再执行
文件查找,相对路径,效率较高,可能出错
return除了从函数中返回,还可以直接从文件中返回
$res = include_once 'aa.php';
全局跟局部
全局变量:只能在全局空间使用,理论上在函数内部不能使用
局部变量:在函数内部定义的变量,只允许在当前函数内使用
超全局变量:系统定义的变量,没有访问限制
global关键字:在函数内部定义的变量的一种方式,内部和外部都能访问
如果global定义的变量名在外部已经存在,那么内部定义的该变量直接指向外部变量的内存空间
可变函数
变量的值刚好是一个函数的名字,类似C中函数指针, 使函数可以通过参数传递,实现回调函数的功能。
function display()
$func = 'display';
$func();
匿名函数
变量保存匿名函数,本质是一个对象(closure)
closure提供一种环境,可以在一些特定的环境下去使用内部函数
函数内部有一些局部变量,在函数执行之后没有被释放,因为在函数内部还有对应的函数在引用。
$func = function() user($name) {} //use将外部变量保留给内部使用,类似lambda函数
function display() {
$name = __FUNCTION__;
$innerfunc = function() user($name) {
echo $name;
};
return $innerfunc;
} $closure = display(); //$name并没有被释放
$closure(); //打印display
错误处理
错误分类
语法错误,运行错误,逻辑错误
错误代号(系统常量)
系统错误:E_PARSE, E_ERROR, E_WARNING, E_NOTICE
用户错误:E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE
其他:E_ALL 代表所有的错误,在进行错误控制的时候用的比较多
trigger_error('xx', [error_type]); //默认notice
//让浏览器按指定字符集解析
header('Content-type:text/html; charset=utf-8');
错误显示配置
- php配置文件,php.ini,全局
display_errors:是否显示错误
error_reporting:显示什么级别的错误
- 在运行的php脚本中设置,优先级高于配置文件
error_reporting();//设置错误显示级别
ini_set('配置项', 配置值);
实际不会将错误展示给用户,不友好,不安全
自定义错误处理
用户自定义错误处理函数,然后将该函数增加到系统错误处理的句柄中,然后系统会在碰到错误是时调用用户定义的错误处理函数。
set_error_handler
字符串类型
多行字符串定义
//nowdoc结构,强引用,上边界符END后面不允许有任何内容,下边界符必须顶格,且后面除了分好不能跟任何内容
$str = <<<'END'
END;
//heredoc结构,弱引用
$str = <<<END
END;
单引号,强引用,只能识别\'
双引号,弱引用,不能识别\'
变量加大括号便于识别,aa{$a}aa
字符串长度
strlen()
mb_strlen() //extension=php_mbstring,可以指定字符集
字符串相关函数
- 转换:implode, explode, str_split
implode: 将数组中元素按指定规则连接
explode: 将字符串按某种格式分隔,变成数组
str_split: 按照指定长度拆分字符串,得到数组
- 截取:trim, ltrim, rtrim
trim: 默认去除两边的空格,也可以指定其他要去除的字符,碰到一个不是的就停止
- 子串: substr, strstr, stristr
substr: 返回指定位置开始指定长度的子串
strstr: 返回匹配字符串首次出现的位置到结尾的子串
- 大小写: strtolower, strtolower, ucfirst
ucfirst: 首字母大写
- 查找: strpos, strrpos
strpos: 查找子串首次出现的位置,返回数字或者FALSE
strrpos: 查找子串最后一次出现的位置
- 替换: str_replace
- 格式化: printf, sprintf
- 其他: str_repeat, str_shuffle
str_repeat: 重复N次
str_shuffle:随机打乱
数组
定义方式
- $a = array(1, 2, 3); //常用
- $a = [1, 2, 3];
- $a[] = 1; $a[1] = 2;
特点
- 不指定下标,系统默认指定比目前已存在的数字下标中最大的数字大1的值(如不存在则为0)
- 元素顺序以放入顺序为准,跟下标无关
- 特殊下标:false变0,true变1,NULL变空字符串
- 数组元素没有类型和长度限制
- php数组储存在堆区,连续内存
多维数组
$info = array(
array('name' => 'Jim', 'age' => 22),
array('name' => 'Tom', 'age' => 28)
);
异形数组:数组元素中有基本类型也有数组
遍历
- foreach
foreach($info as [$下标 =>] $值){
//通过$下标访问下标,通过$值访问元素值
}
- for
for() //count(array)获取长度,下标必须是规律的数字
- while配合each和list
each函数获取当前元素的下标和值,同时指向下一个元素,返回4个元素的数组
0下标 => 元素下标值
1下标 => 元素的值
key下标 => 元素下标值
value下标 => 元素的值如果取不到,返回false
//list,是结构不是函数。从数组从取值,赋值给一组变量。数组必须是从0开始的依次递增的数字下标
list($first, $second)=$arr;
//list于each配合很好
while(list($key, $value) = each($arr))
数组相关函数
排序函数
sort(); //顺序
rsort; //逆序
asort(); //顺序,数组索引保持和单元的关联
arsort(); //逆序,保持索引关系
ksort(); //顺序,按照键名排序
krsort(); //逆序,按照键名排序
shuffle(); //打乱,索引和单元关系不保持
- 指针函数
reset(); //将数组内部指针指向第一个元素,并返回其值
end(); //将数组内部指针指向最后一个元素,并返回其值
next(); //下一个,当没有更多元素时返回FALSE
prev(); //前一个,
current(); //获取当前元素值
key(); //当前指针对应的下标
//next和prev一旦超出范围之后,就回不去了。只能通过reset或者end进行指针重置
- 其他函数
count(); //元素个数
array_push(); //往数组后面中加入一个元素
array_pop(); //从数组后面弹出一个元素并返回
array_shift(); //从数组前面弹出一个元素并返回
array_unshift(); //从数组前面压入一个元素并返回
array_reverse(); //数组元素反转
in_array(); //判断元素是否在数组中
array_keys(); //返回一个数组的所有下标,返回一个索引数组
array_values(); //返回一个数组的所有值,返回一个索引数组
//可以模拟数据结构,栈和队列