PHP基础01

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代码执行流程

  1. 读取代码文件(PHP程序)
  2. 编译:将PHP代码转换成字节码(生成opcode)
  3. zendengine来解析opcode,按照字节码去进行逻辑运算
  4. 转换成对应的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	(可理解成变量套变量

变量传值:

​ 将一个变量赋值给另一个变量

两种方式:

  1. 值传递:将变量保存的值赋值一份,然后将新的值给另一个变量保存。(变量无关)
		$a = 10;
		$b = $a;
		$b = $5;
		echo $a,$b,'<br/>';
		//输出为105  (没加空格
  1. 引用传递:将变量保存的值所在的内存地址,传递给另一个变量。用同一个内存。(感觉类似浅拷贝,学过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__     //当前所属的方法

使用形式:注意定义的时候一定记得赋值

  1. echo 常量名;
  2. 当想输出特殊名字的时候,需要用另一种形式: 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()——判断是否为有效函数名

变量(常量)的作用域

​ 作用域:变量(常量)能够被访问的区域。

  1. 变量可以在普通代码中定义
  2. 变量也可以在函数内部定义

在PHP中作用域有三种:

  1. 全局变量:就是用户普通定义的变量(函数外部定义)

    所属全局空间:在PHP中只允许在全局空间使用,理论上函数内部不可用

    脚本周期:直到脚本运行结束才会消失

  2. 局部变量:在函数内部定义的变量

    所属当前函数空间:在PHP中只允许在当前函数自己内部中使用

    函数周期:函数执行结束(函数是在栈区中开辟独立内存空间运行

  3. 超全局变量:系统定义的变量(预定义变量:$_SERVER、$_POST等

    所属超全局空间:没有访问限制(函数内外都可访问)

超全局变量会将全局变量自动纳入到$GLOBALS里面,而$GLOBALs没有作用域限制,所以能帮助局部取访问全局变量,但必须用数组方式

<?php
	$ a = 10; //最终会被系统纳入到超全局变量中:$GLOBALS['a']
	function show(){ 
        echo $GLOBALS['a'];
    }

如果函数内部想调用外部变量:除了$GLOBALS 之外,通过参数传值(如果要引用战线,还可以使用引用传值。

在PHP中还有一种方式,能实现全局访问局部,同时局部也可以访问全局:global关键字

global关键字: 一种在函数里面定义变量的一种方式

  1. 如果使用global定义的变量名在外部存在(全局变量),那么系统直接指向外部全局变量所指向的内存空间(同一变量,不同名字)
  2. 如果使用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关键字这一行

使用:

  1. 为了统计当前函数被调用次数(显然也可以超全局变量来统计
  2. 统筹函数多次调用得到的不同结果。(递归思想)

数据类型

​ 指存储的数据本身的类型,不是变量的类型。

​ PHP是一种弱类型语言,变量本身没有数据类型

八种数据类型

​ php中的数据分为三大类八小类

一、简单数据类型

  • 整型:int/integer,占4个字节,表示整数类型。

  • 浮点型:float/double,占8个字节,表示小数或整型存不下的数

  • 字符串型:string,系统根据实际长度分配内存,表示字符串(加引号)

  • 布尔类型:bool/boolean,表示布尔类型,只有true 和 false

二、复合数据类型

  • 对象类型:object,存放对象(面向对象)

  • 数组类型:array,存储多个数据(一次性)

三、特殊数据结构类型

  • 资源类型:resource,存放资源数据(PHP外部数据,eg:数据库、文件)

  • 空类型:NULL,只有一个值,为NULL(不能运算)

数据类型转换

​ 在很多条件下,需要指定的数据类型,需要外部数据(PHP目前获得的数据),转换成目标数据类型。

两种转换方式

  1. 自动转换:系统根据需求自己判定,自己转换(用得多,效率低

  2. 强制(手动)转换:人为根据需要的目标类型转换。

    强制转换的规则:在变量前加() 在里面写对应的类型(你想转的),想转NULL类型需要用unset();

注:1.在转换中,用的比较多的是转布尔类型(判断)和转数值类型(算术运算)

2.其它类型转bool类型:(详见下面bool类型的表格)

说明:

  1. 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

四、字符串类型

伪类型

(我也不知道放在这里是否合适,暂且放这里了

​ 假类型,实际上在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;

在这里解释一下:

  1. 如果表达式的值为true,得到表达式2;
  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

但是这种写法很容易忘记{},还不美观,所以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 结果(可以没有
    }
	
	/*调用函数*/
	函数名([参数]);  //定义时候有参数一定记得传参

函数是在代码执行阶段,碰到函数名字的时候才会调用,不是在编译阶段。

调用特点: 只要系统能在内存中找到对应的函数,就可以执行。(调用可在函数定义之前。

函数执行的内存分析

  1. 读取代码进入到代码段(编译:将代码编译字节码存储到内存
  2. 根据代码逐行执行

那么无论在什么位置都能调用函数就是因为:编译和执行是分开的

函数命名规范

​ 与变量的命名规则相同。不可以数字开头。

建议命名的时候用名字代表函数功能

注:在一个脚本周期中,不允许出现同名函数。(通常在一个系统开发中,不会使用同名函数。

对参数的解释

一、形参

​ 形式参数,不具有实际意义的参数,在函数定义时使用的参数。(形参可以有多个,用逗号分隔。

二、实参

​ 实际参数,具有实际意义的参数,在函数调用时使用的参数。

(传入的实参,可以是变量或者其它有值的表达式:变量、常量、运算符计算结果。

形参是实参的载体。在实际调用的时候,数据以实参的形式传递给形参,给形参赋值以达到调用的效果。

<?php
	function add($x,$y){echo $x + $y;}
	$a = 1;
	add($a,2); 

注:

  1. PHP中允许实参 >= 形参(个数),多余的,函数内部不用而已。(不可以比形参少

  2. PHP中理论上形参个数没有限制

三、默认值

​ default value,指的是形参的默认值,在函数定义的时候,就给形参进行一个初始赋值;如果调用时候实参没有给形参赋值,形参就会用定义的值参与运算。

通常用在,一定会有某个数据参与,但是可能通常是某个我们知道的值。

默认值存在的时候,可以不用传入。

<?php
	function minus($x = 0,$y = 0){echo $x + $y;}

注:

  1. 默认值的定义需要放在最后面(可以有多个),不能前面有而后面没有。
  2. 每个独立的函数中,函数名与形参名不冲突;在不同函数中也可以有相同的形参名

四、引用传递

​ 实参在调用的时候,会将值赋给形参,但是本身没关系。如果有时候想让实参的值变换,需要引用传值。(在形参名字前加地址符&,并且传入的实参必须是变量

<?php
	function 函数名(&形参名){
        //函数体;
    }
	函数名(参数)
//调用的时候,这个参必须是变量!

五、函数体

​ 函数体:大括号里面的所有代码。(基本你要用到的都能干。

六、函数返回值

​ return,通过return关键字将函数的结果,返回给外部。(没有return时,系统默认返回NULL。

<?php
	function add($x,$y){return $x + $y;}
	//与上面不同的是这里用的是return。

	$a = add(1,2);
	//可以定义变量来接收这个值

注:

  1. 函数返回值可以是任意数据类型。
  2. return不仅可以返回结果,也标志着被调用函数结束运行。
  3. 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

匿名函数

​ 没有名字的函数。

<?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://www.cnblogs.com/seintf/p/14160590.html