PHP
运行在服务器端的脚本语言,可嵌入HTML
动态网站开发的脚本语言,动态语言特点是交互性,会有数据的传递,php作为中介来传递数据。传递的前提是php能自己存储数据( 临时存储 )
处理脚本让浏览器按照指定字符集解析的方法:
<?php header('Content-type:text/html;charset=utf-8');
代码标记
ASP标记:<%php代码%>
短标记:
(上面的基本弃用,使用需要在配置文件开启)
脚本标记:<script language= "php”>php代码
标准标记:
<html>
<body>
<b>
//标准标记
echo 'hello word';
</body>
</html>
PHP代码执行流程
- 读取代码文件(PHP程序)
- 编译:将PHP代码转换成字节码(生成opcode)
- zendengine来解析opcode,按照字节码去进行逻辑运算
- 转换成对应的HTML代码
注释
写的时候加注释(思路说明
分为两种:(和C差不多)
1.行注释 用 //
or #
2.块注释 /* */
语句分隔符
php中,代码以行为单位,系统通过判断行的结束,结束用;
(_英)
注意:
1.php中标记结束符?>
有自带语句结束符的效果,最后一行PHP代码可以没有;
2.php中很多代码的书写不是嵌入到html中,而是单独存在,通常书写习惯中不建议用 ?>,PHP会自动从开始到最后全部认为是php代码,从而解析。 (就是只写< ? php代码
内存分区:
1.栈区:程序可以操作的内存部分(不存数据,运行代码),少但是快。
2.代码段:存储程序的内存部分
3.数据段:存储普通数据(全局区和静态区)
4.堆区:存储复杂数据,大但是效率低
变量与常量
变量
存数据、有名字、通过变量名访问数据、变量中的数据可变
定义都得用$
定义:
必须用$开始
命名规则同C、C++、python等语言(字母数字下划线
允许中文变量(尽量别用
预定义变量:
提前定义的变量,系统定义的,存储许多需要用到的数据(预定义变量都是数组
常用:
$_GET //获取所有表单以get方式提交的数据
$_POST //POST提交的数据都保存在这里
$_REQUEST //GET和POST提交的都会保存
$_SERVER //服务器信息
$_SESSION //session会话数据
$_COOKIE //cookie会话数据
不太常用:
$GLOBALS: //PHP中所有的全局变量
$_ENV: //环境信息
$_FILES: //用户上传的文件信息
可变变量:
如果一个变量保存的值刚好是另一个变量的名字,那么可以直接通过访问一个变量得到另一个变量的值:在变量前面多加一个$
$a = 'b';
$b = 'bb';
echo $$a;//输出为bb (可理解成变量套变量
变量传值:
将一个变量赋值给另一个变量
两种方式:
- 值传递:将变量保存的值赋值一份,然后将新的值给另一个变量保存。(变量无关)
$a = 10;
$b = $a;
$b = $5;
echo $a,$b,'<br/>';
//输出为105 (没加空格
- 引用传递:将变量保存的值所在的内存地址,传递给另一个变量。用同一个内存。(感觉类似浅拷贝,学过python的同学应该可以理解
$c = 10;
$d = &$c;
$c = 5;
echo $c,$d,'<br/>';
//输出为55 (没加空格
<?php
$name;
//赋值
$age = 17;//同时定义并赋值
//访问
echo $age;
//修改
$age = 18;//修改
echo '<hr/>',$age;//输出换行符和$age
//删除 用 unset()
unset($age);
echo $age; //会报undefined
常量
const/constant,一种在程序运行中不可改变的量(数据),是用户级别的。
同变量,用来存储数据。
定义:
写法:
1.用定义常量的函数: define('常量名',常量值)
define('PI',3.1415926);
2.const 常量名 = 常量值 (5.3以后可用,目前版本都可用
const PI = 3.1415926;
注意:
1.define和const定义的常量有区别:访问权限方面有区别
2.定义常量通常不区分大小写,但可以区分。(参照define函数的第三个参数
规则:
1.不能用 $ (用的话会被认为是变量。
2.经常用大写字母
3.命名规则同C、C++、python等语言(字母数字下划线
4.常量命名规则比变量松散,可用一些特殊字符(这时候只能用define
define('-_-',5);
系统常量:
系统帮助用户定义的常量,用户可直接使用。
常用的几个:
<?php
PHP_VERSION //PHP版本号
PHP_INT_SIZE //整型大小(几个字节
PHP_INT_MAX //整型能表示的最大的值(PHP中整型允许出现负数,带符号)
系统魔术常量:双下划线+常量名+双下划线 (魔术常量的值通常会跟环境变化,用户不可操作
__DIR__ //当前被执行脚本所在电脑的绝对路径
__FILE__ //当前被执行脚本所在电脑的绝对路径(带自己的文件名字)
__LINE__ //当前所属行数 (在php中第几行
__NAMESPACE__ //当前所属命名空间
__CLASS__ //当前所属的类
__METHOD__ //当前所属的方法
使用形式:注意定义的时候一定记得赋值
- echo 常量名;
- 当想输出特殊名字的时候,需要用另一种形式: constant('常量名')
注意:常量和变量的使用,(看数据会不会变化,来决定使用哪个
<?php
define('PI',31415926);
echo PI;
define('-_-',5);
echo constant('-_-');
与变量有关的函数:
- isset(变量);。判断变量是否存在, 如果值为 NULL 也等价于不存在
- unset(变量);。释放变量所占资源
- setType(变量, 类型);。改变变量数据类型
- getType(变量);。获取变量数据类型
- empty(变量);。判断变量是否为空
- var_dump();。输出变量的类型和值
- is_类型(变量);。判断变量是否为某个类型, 如:
is_int()
is_array()
is_resource()
is_scalar()——是否为标量
is_numeric()——是否为数字或数字字符串
is_callable()——判断是否为有效函数名
变量(常量)的作用域
作用域:变量(常量)能够被访问的区域。
- 变量可以在普通代码中定义
- 变量也可以在函数内部定义
在PHP中作用域有三种:
全局变量:就是用户普通定义的变量(函数外部定义)
所属全局空间:在PHP中只允许在全局空间使用,理论上函数内部不可用
脚本周期:直到脚本运行结束才会消失
局部变量:在函数内部定义的变量
所属当前函数空间:在PHP中只允许在当前函数自己内部中使用
函数周期:函数执行结束(函数是在栈区中开辟独立内存空间运行
超全局变量:系统定义的变量(预定义变量:$_SERVER、$_POST等
所属超全局空间:没有访问限制(函数内外都可访问)
超全局变量会将全局变量自动纳入到$GLOBALS里面,而$GLOBALs没有作用域限制,所以能帮助局部取访问全局变量,但必须用数组方式。
<?php
$ a = 10; //最终会被系统纳入到超全局变量中:$GLOBALS['a']
function show(){
echo $GLOBALS['a'];
}
如果函数内部想调用外部变量:除了$GLOBALS 之外,通过参数传值(如果要引用战线,还可以使用引用传值。
在PHP中还有一种方式,能实现全局访问局部,同时局部也可以访问全局:global关键字
global关键字: 一种在函数里面定义变量的一种方式
- 如果使用global定义的变量名在外部存在(全局变量),那么系统直接指向外部全局变量所指向的内存空间(同一变量,不同名字)
- 如果使用global定义的变量名在外部不存在(全局变量),系统会自动在全局空间(外部)定义一个与局部变量同名的全局变量。
本质的形式:在函数的内部和外部,对一个同名变量(全局和局部)使用同一块内存地址保存数据,从而实现共同拥有。
<?php
$a = 10;
function show(){
//在函数中调用全局变量
global $a;
echo $a;
//定义一个局部变量,全局变量中不存在;
global $b;
$b = 'b';
}
echo $b;//可以调用。
虽然可以实现全局与局部的互访,但是通常不这么用。一般如果和存在特殊使用,也会使用参数的形式来访问。(还可用常量,用define定义)
静态变量
static,在函数内部定义的量,使用static关键字修饰,用来实现跨函数共享数据的变量:函数运行结束所有局部变量都会清空,如果重新运行一下函数,所有的局部变量又会重新初始化。
<?php
funticon show(){
//定义变量
$ a = 1;
//定义静态变量,最好定义的时候就赋值
static $b = 1;
echo $a++,' ',$b++,<'br'>;
}
show();//1 1
show();//1 2
show();//1 3
//这样应该不难理解静态变量了。
作用:
为了跨函数共享数据(注意是:同一个函数多次使用。
原理:
系统在进行编译的时候就会对static进行初始化:给其赋值。
函数在调用的时候会自动跳过static关键字这一行
使用:
- 为了统计当前函数被调用次数(显然也可以超全局变量来统计
- 统筹函数多次调用得到的不同结果。(递归思想)
数据类型
指存储的数据本身的类型,不是变量的类型。
PHP是一种弱类型语言,变量本身没有数据类型。
八种数据类型
php中的数据分为三大类八小类
一、简单数据类型
-
整型:int/integer,占4个字节,表示整数类型。
-
浮点型:float/double,占8个字节,表示小数或整型存不下的数
-
字符串型:string,系统根据实际长度分配内存,表示字符串(加引号)
-
布尔类型:bool/boolean,表示布尔类型,只有true 和 false
二、复合数据类型
-
对象类型:object,存放对象(面向对象)
-
数组类型:array,存储多个数据(一次性)
三、特殊数据结构类型
-
资源类型:resource,存放资源数据(PHP外部数据,eg:数据库、文件)
-
空类型:NULL,只有一个值,为NULL(不能运算)
数据类型转换
在很多条件下,需要指定的数据类型,需要外部数据(PHP目前获得的数据),转换成目标数据类型。
两种转换方式
-
自动转换:系统根据需求自己判定,自己转换(用得多,效率低
-
强制(手动)转换:人为根据需要的目标类型转换。
强制转换的规则:在变量前加
()
在里面写对应的类型(你想转的),想转NULL类型需要用unset();
注:1.在转换中,用的比较多的是转布尔类型(判断)和转数值类型(算术运算)
2.其它类型转bool类型:(详见下面bool类型的表格)
说明:
-
true 是 1 ,false 是 0
2.字符串类型转数值的规则
2.1:以字母开头的字符串,永远为0
2.2:以数字为开头的字符串,取到碰到非数字字符开始(不会同时包含两个小数点)
数据类型判断
通过一组类型判断函数判断变量,最终返回这个变量所保存数据的数据类型。
写法: is_+类型名(变量名) (eg:is\_int(a)、is\_bool(b))
如果是就返回true,不是就返回false; (为bool类型
bool类型不能用echo查看,可用var_dump结构查看 (eg:var\_dump(变量1,变量2...))
<?php
$a = 'abc123456';
var_dump(is_int($a));//bool(false)
var_dump(is_string($a));//bool(true)
还有一组函数可以用来获取并设定数据(变量)的类型
gettype(变量名):获取类型,得到该类型对应的字符串
settype(变量名,'类型'):设定数据类型,不同于强制转换。
<?php
gettype($a);///string
var_dump(setttype($b,'int'));//bool(true)
/*true表示成功,false表示失败*/
echo gettype($b); // integer
1. 强制转换(类型)变量名,是对数据值复制的内容进行处理(不处理实际存储的内容) (可理解为只是当前语句中改变一下
2.settype会直接改变数据本身 (改变之后就全变了
整数类型进制简介
用来保存整数数值(范围限制),占4个字节,有正负;
<?php
$a = 0b110;//二进制前面加0b
$a = 0110;//八进制前面加0
$a = 110;//十进制前面什么都不加
$a = 0x110;//十六进制前面加0x
//注 :php的输出,数值默认转换成10进制来输出
//用PHP_INT_MAX来求int的最大值--->2147483647
/*
进制转换:
手动十进制转二进制的方法:(这里提一下
1.除二取余,整数部分倒排,小数部分正排。(不管是什么数,要补满32位
2.取2的次幂,每次取不大于这个数的最大的2的次幂。
其它的转换,相信大家都学过,不过多的解释。十进制转R进制都是每次除R取余。
用函数:
十进制转其它进制:
decbin(x) //把十进制的x转换成二进制数,string类型
decoct(x) //把十进制的x转换成八进制数,string类型
dechex(x) //把十进制的x装换成十六进制数,string类型
二进制转其它进制:
bin2hex(x) //二进制转换成十六进制 ,string类型
bindec(x)//二进制转十进制,数值比int范围大的时候,返回float类型
八进制转其它进制:
octdec(x)//八进制转十进制,数值比int范围大的时候,返回float类型
十六进制转十进制:
hexdec(x)//十六进制转十进制,数值比int范围大的时候,返回float类型。hexdec() 将遇到的所有非十六进制字符替换成 0。这样,所有左边的零都被忽略,但右边的零会计入值中。
任意进制转换:
base_convert(x,a,b);//把a进制下的x转换成b进制,(a,b都在2-36之间)x中的数字比10大的数字用a-z表示。z 表示 35. 返回为string类型。
*/
一、整数类型
略
二、浮点类型
小数类型,以及存储超整型范围的整数(但是不保证精度,精度范围在15个有效数字左右。
<?php
$f1 = 1.23;
$f2 = 1.2345e4; //e后面只能接整数
var_dump($f1,$f2); // float(1.23) float(12345)
//当整型超过自身的存储大小之后用浮点型存储
/*
为啥浮点数能表示更大的数据?
00000000 00000000 00000000 00000000 --> 11111111 11111111 11111111 11111111 (整型的最大值,所有位都是有效数据
00000000 00000000 00000000 00000000 --> 1'1111111' 11111111 11111111 11111111 (浮点数的前7位算的结果是10的指数(10^128),后面三个字节存储表示具体数值。
*/
尽量别用浮点数做精确判断,计算机中小数存储一般都不准。
三、布尔类型
只有两个值,true和false,通常用来判断比较。
<?php
$b1 = true;
$b2 = FALSE;
var_dump($b1,$b2);
// bool(true)bool(false)
在进行数据判断的时候,需要特别注意类型转换:
empty() : 判断是否为空,同C/C++中常用的函数
lsset() : 判断数据存储的变量本身是否存在,存在返回true,不存在返回false;
![一些判断函数以及返回值.PNG](https://i.loli.net/2020/12/19/TSqd8VlymU9HWiC.png)
四、字符串类型
伪类型
(我也不知道放在这里是否合适,暂且放这里了
假类型,实际上在php中不存在的类型,但是通过伪类型可以帮助程序员更好的查看操作手册,从而更方便学习。
主要有两种
- mixed:可以是多中php中的数据类型
- number:数值的,可以是任意数值类型(整型和浮点型
mixed-->只要是php中的类型即可
运算符(operator)
将数据进行运算的特殊符号,在php中一共有十种。(在C语言中一些没有学过的运算符前面用*标出了
一、赋值运算符
‘=’ :右边的赋值给左边。(可以是变量、数据、常量、其他运算出来的结果)将右边的结果保存到内存的某个位置,再将位置的内存地址赋值给左侧的变量(常量)。
(和你之前学的一样。
二、算术运算符
+、-、*、/、% 与所学语言的含义相同,不作过多解释。
/后面不能是0,%后面不能是0
*三、比较运算符
>、>=、<、<=、== 、!= 与之前所学语言一样,不过多解释。
注意:这些只比较值的大小,eg:'123' == 123为true
-
===:全等于,左边与右边相同的条件:大小以及数据的类型都要相同
-
!==:不全等于,大小或者类型不同即可
四、逻辑运算符
针对不同结果进行匹配;
&&、||、! 相信学过的同学都会,不过多阐述。
别忘了 &&和||还叫短路运算:第一个表达式结果满足条件的话,那么就不会运行运算符后面的表达式了。
写代码的时候,尽量将出现频率最高(能直接判断出结果的)的表达式放在第一位
*五、连接运算符
将多个字符串拼接的符号
- . : 将两个字符串连接到一起
- .= :复合运算。$a .=$b等价于$a =$a .$b (这里为全角实现为半角
*六、错误抑制符
PHP中一些错误可以提前预知,但是这些错误可能无法避免,但是又不希望报错给用户看,可用错误抑制符处理
- @:在可能出错的表达式前加@符号即可
<?php
$a =10;
$b = 0;
@($a % $b);//不会报错
$a % $b;//会报错
//引用: 错误抑制符通常在生产环境(上线)会用到,在开发的时候不会用:系统本身最好没有任何错误。
七、三目运算符
三个表达式参与运算,是简单的分支结构缩写;(可复合使用
- 表达式1 ? 表达式2: 表达式3;
在这里解释一下:
- 如果表达式的值为true,得到表达式2;
- 如果表达式的值为false,得到表达式3;
八、自操作运算符
自己操作自己(。
- $a++; 等价于$a =$a + 1;
- $a--; 等价于$a =$a - 1;
注:++、--可在$a的前后,决定着运算顺序。(在前先执行,在后后执行
九、复合运算符
+=、-=、*=、/=、%= 举例:$a += $b 等价于 $a = $a + $b ,其它的同理。
注:/和%的时候,考虑右边表达式的结果是否为0
十、位运算符
计算机码
计算机在实际存储数据的时候,采取的编码规则(二进制规则)。包括原码、反码和补码。数值本身最左边一位是用来充当符号位的:正数为0,负数为1。
-
原码:数据本身从十进制转换成二进制得到的结果。
-
反码:针对负数,符号位不变,其他位取反。(正数的反码还是他本身
-
补码:针对负数,反码加1。
系统中有两个 0 : +0与-0:
+0:00000000 -0:10000000 存储形式都是补码的00000000
位运算符
取出计算机中最小的单位(位bit)进行运算。(这里用的是全角,真正实现起来是半角
- & 按位与:两个都是1才会是1
- | 按位或:只要有一个是1就是1
- ~ 按位非:就是取反.~1-->0 , ~0-->1
- ^ 按位异或:相同为0,不同为1
- << 按位左移 1 << i <--->2 ^ i
- >> 按位右移 1 >> i <--->1/2^i
进行位运算时候用的都是补码.运算之后必须转换成原码才是最终要的结果.
右移位运算不足的时候,补的是符号位.
十一、运算符的优先级
用多了就能比较熟悉了,(运算符多的时候加括号就没问题
详见php手册
结构
代码执行的方向
结构分类
- 顺序结构:从上往下,顺序执行。(代码执行最基本结构
- 分支结构:给定一个条件,同时有多种可执行代码块,由条件判定执行某一代码
- 循环结构:满足条件的前提下,重复执行这一代码块
1.顺序结构
最基本的结构,所有代码默认从上往下顺序执行。
2.分支结构
分为if分支和switch分支
2.1 if分支
相信学过其它语言的同学都能理解意思。这里只放出写法
<?php
//基础结构
if(条件表达式){
语句1;
}
else{
语句2;
}
//复合结构
if(条件表达式1){
语句1;
}
else if(条件表达式2){ //也可写成elseif
语句2;
}
else{
语句3;
}
2.2 switch分支
同样只放出写法。
<?php
switch(条件表达式){
case 值1:
语句1;
break;
case 值2:
语句2;
break;
default:
break;
}
3.循环结构
分为for循环、while循环、do-while循环、foreach循环(专门针对数组
这里不给出对于哪种问题用哪个循环,相信在学习过程中,有自己的一个写法。
3.1 for循环
<?php
for(表达式1;表达式2;表达式3){
语句;
}
/*
表达式1是赋值语句(赋初值。可以用逗号隔开定义多个变量
表达式2是判断语句(判断边界
表达式3是条件变化语句
*/
3.2 while循环
<?php
while(条件表达式){
语句;
}
//条件表达式即为判断语句,判断边界用。
3.3 do-while循环
<?php
do{
语句;
}while(条件表达式);
//条件表达式为判断语句,判断边界用。
3.4 循环控制
在循环内部对循环本身进行控制。
-
中断控制:重新开始循环,循环体中还有其他内容,也再执行。 (continue)(跳过当前层的一次循环
-
终止控制:直接结束循环。(break)(直接跳出当前层的循环
使用情况自行决定。
注意:php中有 continue x、break x; (理解起来就是对于x层循环的操作
4.流程控制替代语法
分支结构和循环结构的替代语法
php本身是嵌入到HTML的脚本语言,需要在HTML中写一些用于判断或循环的结构语法,必须符合php标签规范,需要HTML与PHP进行混搭,如果使用原始的php代码就非常不美观
//打印九九乘法表
<table border=1>
<?php for($i = 1 ;$i <= 9;$i++){?>
<tr>
<?php for($j = 1;$j <= $i;$j++){?>
<td>
<?php echo $i. '*' . $j . '=' .$i * $j;?>
</td>
<?php }?>
</tr>
<?php }?>
</table>
/*
<table>是表格
<tr>是表格里的行
<td>是行里的单元格
*/
这是输出结果
![九九乘法表.PNG](https://i.loli.net/2020/12/19/1NUH9kpMxyERvFB.png)
但是这种写法很容易忘记{},还不美观,所以php提供了一种替代机制,让其可以不写大括号
for( ; ; ){ --> for( ; ; ): //注意这里有个冒号!
} --> endfor;
那么就有另一种写法:
//打印九九乘法表
<table border=1>
<?php for($i = 1 ;$i <= 9;$i++):?>
<tr>
<?php for($j = 1;$j <= $i;$j++):?>
<td>
<?php echo $i. '*' . $j . '=' .$i * $j;?>
</td>
<?php endfor;?>
</tr>
<?php endfor;?>
</table>
4.1 php中具体有哪些替代语法?
php应该在HTML中只做数据输出,输出通产伴有条件判断和循环操作,因此php提供了对应分支结构和循环结构的替代语法:全部对应一个模式。
- { --> :(左大括号用冒号来替换
- } --> end+对应起始标记
if(): endif;
switch(): endswitch;
for(;;); endfor;
while(): endwhile;
函数
函数的基本概念
function,一种语法结构,用来封装代码块,实现复用。
函数定义语法
重要成分:function关键字、函数名、形参与实参、函数体和返回值。
<?php
/*定义函数*/
function 函数名([参数]){
//函数体
//返回值: return 结果(可以没有
}
/*调用函数*/
函数名([参数]); //定义时候有参数一定记得传参
函数是在代码执行阶段,碰到函数名字的时候才会调用,不是在编译阶段。
调用特点: 只要系统能在内存中找到对应的函数,就可以执行。(调用可在函数定义之前。
函数执行的内存分析
- 读取代码进入到代码段(编译:将代码编译字节码存储到内存
- 根据代码逐行执行
那么无论在什么位置都能调用函数就是因为:编译和执行是分开的
函数命名规范
与变量的命名规则相同。不可以数字开头。
建议命名的时候用名字代表函数功能
注:在一个脚本周期中,不允许出现同名函数。(通常在一个系统开发中,不会使用同名函数。
对参数的解释
一、形参
形式参数,不具有实际意义的参数,在函数定义时使用的参数。(形参可以有多个,用逗号分隔。
二、实参
实际参数,具有实际意义的参数,在函数调用时使用的参数。
(传入的实参,可以是变量或者其它有值的表达式:变量、常量、运算符计算结果。
形参是实参的载体。在实际调用的时候,数据以实参的形式传递给形参,给形参赋值以达到调用的效果。
<?php
function add($x,$y){echo $x + $y;}
$a = 1;
add($a,2);
注:
-
PHP中允许实参 >= 形参(个数),多余的,函数内部不用而已。(不可以比形参少
-
PHP中理论上形参个数没有限制
三、默认值
default value,指的是形参的默认值,在函数定义的时候,就给形参进行一个初始赋值;如果调用时候实参没有给形参赋值,形参就会用定义的值参与运算。
通常用在,一定会有某个数据参与,但是可能通常是某个我们知道的值。
默认值存在的时候,可以不用传入。
<?php
function minus($x = 0,$y = 0){echo $x + $y;}
注:
- 默认值的定义需要放在最后面(可以有多个),不能前面有而后面没有。
- 每个独立的函数中,函数名与形参名不冲突;在不同函数中也可以有相同的形参名
四、引用传递
实参在调用的时候,会将值赋给形参,但是本身没关系。如果有时候想让实参的值变换,需要引用传值。(在形参名字前加地址符&,并且传入的实参必须是变量!
<?php
function 函数名(&形参名){
//函数体;
}
函数名(参数)
//调用的时候,这个参必须是变量!
五、函数体
函数体:大括号里面的所有代码。(基本你要用到的都能干。
六、函数返回值
return,通过return关键字将函数的结果,返回给外部。(没有return时,系统默认返回NULL。
<?php
function add($x,$y){return $x + $y;}
//与上面不同的是这里用的是return。
$a = add(1,2);
//可以定义变量来接收这个值
注:
- 函数返回值可以是任意数据类型。
- return不仅可以返回结果,也标志着被调用函数结束运行。
- return还可以在文件中直接使用(不在函数里面),这样做代表文件将return 后面的内容,转交给当前文件的位置(通常在系统配置文件中使用)。在return之后的代码不会执行。
第三点可以简单理解成文件嵌套包含中的调用。
常用的系统函数
一、有关输出的函数
- print(); 类似于echo输出提供的内容,本质上是一种结构,(不是函数,且可不用函数
- print_r(); 类似于var_dump,但是比var_dump简单,不会输出数据类型,只会输出值(常用在数组打印
<?php
echo print('hello<br/>');
print 'hello<br/>';
$a = 'hello<br/>';
print_r($a);
/*
hello
1hello //这里这个1是输出的是调用print函数时候的返回值
hello
*/
注意:print_r(mixed x,[bool y])里面可以传入两个参数,这里不解释x,其中y可有可无:当y为true时,print_r()不输出结果,而是赋值给一个变量;y为false时,直接输出结果。默认为false。
二、有关时间的函数
详细的看这里
- date():按照指定格式对对应的时间戳(从1970年格林威治时间开始计算的秒数),如果没有给定参数,那就是当前的时间戳等价于time() 详见此处 (不建议去背,用多了会熟。
- time():获取当前时间对应的时间戳 详见此处
- microtime():获取微秒级别的时间 详见此处
- strtotime():按照规定格式的字符串转换成时间戳 详见此处
三、有关数学的函数
-
max():指定参数中最大的值
-
min():指定参数中最小的值
-
rand(a,b):得到[a,b]中的一个随机整数
-
mt_rand():与rand()一样,只是底层结构不一样,效率比rand高
-
round():四舍五入
-
ceil():向上取整
-
floor():向下取整
-
pow(a,x):计算a^x
-
abs():求绝对值
-
sqrt():开根号
四、有关函数的函数
- function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高
- func_get_arg():在自定义函数中去获取指定数值对应的参数
- func_get_args():在自定义函数中获取所有的参数(数组)
- func_num_args():获取当前自定义函数的参数数量
<?php
function test($a,$b){
//获取指定参数
var_dump(func_get_arg(1));//返回索引为1的,注意还是从0开始,这里返回$b
//获取所有参数
var_dump(func_get_args());
//获取参数数量
var_dump(func_num_args());
}
function_exists('test') && test(1,'2',3,4);
/*
string(1)"2"
array(4) {
[0]=>
int(1)
[1]=>
string(1)"2"
[2]=>
int(3)
[3]=>
int(4)
}
int(4)
*/
func_get_args和func_num_args都是统计的对应实参的数量。
可变函数
当前有一个变量所保存的值,刚好是一个函数的名字,那么就可以使用变量+()来充当函数名使用。
<?php
$ nam = 'show';
function show(){
//函数体
}
//可变函数
$nam();//可以调用show函数,并执行函数体。
可变函数在系统使用过程中比较多,尤其是使用很多系统函数的时候,需要用户在外部定义一个自定义函数,但是是需要传入到系统函数内部使用。
![回调函数.PNG](https://i.loli.net/2020/12/19/cPZCnbjBiwhSAlR.png)
匿名函数
没有名字的函数。
<?php
变量名 = function(){
//函数体
};//注意这里要有个分号
$变量名();//调
有何意义?
变量保存匿名函数,本质得到的是一个对象(closure);
闭包(closure)
“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。 ----来自度娘
简单理解:
函数内部有一些局部变量(要执行的代码块)在函数执行后没有被释放,是因为在函数内部还有对应的函数在引用。
闭包可以理解成:“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
<?php
function show(){
$name = __FUNCTION__;
$innerfunction = function() use($name){//use就是将外部变量(局部)保留给内部使用(闭包)
echo $name;
}
$innerfunction();//调用内部函数
}
/*
如何证明函数的局部变量在函数使用完之后没有被释放?
1. 使用内部匿名函数
2. 匿名函数使用局部变量:use
3. 匿名函数被返回给外部使用。
*/
function shows(){
$nam = __FUNCTION__;
$innerfunction = function() use($nam){//use就是将外部变量(局部)保留给内部使用(闭包)
echo $nam;
}
return $innerfunction();//调用内部函数
}
$now = shows();
// 到当前位置,shows函数运行结束,理论上局部变量$nam已经被释放。
echo $nam;//仍旧输出shows,$name并没有被释放。
![闭包.PNG](https://i.loli.net/2020/12/19/aNO3lEgPh4jyBob.png)