zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Linux运维必会的MySql题之(四)
    Linux运维必会的MySql题之(三)
    Linux运维必会的MySql题之(二)
    Linux运维必会的MySql题之(一)
    Centos7 yum安装Mysql
    Devoos核心要点及kubernetes架构概述
    kubernetes基本概念
    BZOJ2631 tree 【LCT】
    BZOJ2431 [HAOI2009]逆序对数列 【dp】
    BZOJ1483 [HNOI2009]梦幻布丁 【链表 + 启发式合并】
  • 原文地址:https://www.cnblogs.com/seintf/p/14160590.html
Copyright © 2011-2022 走看看