八、PHP 数组
数组:array,数据的组合,指将一组数据(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过变量一次性得到该容器中的所有数据.
创建数组 在 PHP 中,array()
函数用于创建数组
在 PHP 中,有三种类型的数组:
数值数组 - 带有数字 ID 键的数组
关联数组 - 带有指定的键的数组,每个键关联一个值
多维数组 - 包含一个或多个数组的数组
1 2 3 4 5 6 7 8 在PHP中系统提供多种定义数组的方式: 1 . 使用array 关键字:最常用的$变量= (array 元素1 ,元素2 ,元素3 ..); 2 . 可以使用中括号来包裹数据:$变量 = [元素1 ,元素2 ...]; 3 . 隐形定义数组:给变量增加一个中括号,系统自动变成数组$变量[]=值1 ; $变量[下标]=值;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?php $array_num =array ("php" ,"java" ,"python" ); $array_num1 =array (); $array_num1 [0 ]="php" ; $array_num1 [1 ]="java" ; $array_num1 [2 ]="python" ; var_dump ($array_num ); echo "</br>" ; var_dump ($array_num1 ); echo "</br>" ; $array_key =array ("姓名" =>"张三" ,"成绩" =>100 ,"班级" =>"2班" ); $array_key1 =array (); $array_key1 ["姓名" ]="张三" ; $array_num1 ["成绩" ]=100 ; $array_num1 ["班级" ]="2班" ; var_dump ($array_key ); echo "</br>" ; var_dump ($array_key1 );
多维数组 多维数组是包含一个或多个数组的数组.
在多维数组中,主数组中的每一个元素也可以是一个数组,子数组中的每一个元素也可以是一个数组.
数组的维度指示您需要选择元素的索引数.
对于二维数组,您需要两个索引来选取元素
对于三维数组,您需要三个索引来选取元素
在第二维度的数组元素中可以继续是数组,在PHP中没有维度限制(PHP本质并没有二维数组),但是不建议使用超过三维以上的数组,会增加访问的复杂度,降低访问效率.
两维数组 两维数组是数组的数组(三维数组是数组的数组的数组).
姓名
年龄
性别
php
30
男
Bob
17
女
Tony
21
男
wink
15
女
如下将上表中的数据存储到两维数组中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php $user = array ( array ("php" ,30 ,"男" ), array ("Bob" ,15 ,"女" ), array ("Tony" ,5 ,"男" ), array ("Wink" ,17 ,"女" ) ); echo $user [0 ][0 ].":年龄 :" .$user [0 ][1 ].", 性别:" .$user [0 ][2 ].".<br>" ; echo $user [1 ][0 ].":年龄 :" .$user [1 ][1 ].", 性别:" .$user [1 ][2 ].".<br>" ; echo $user [2 ][0 ].":年龄 :" .$user [2 ][1 ].", 性别:" .$user [2 ][2 ].".<br>" ; echo $user [3 ][0 ].":年龄 :" .$user [3 ][1 ].", 性别:" .$user [3 ][2 ].".<br>" ;
数组的常用操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <?php $fruits = array ('apple' , 'banana' , 'orange' ); array_unshift ($fruits ,"tomato" ); print_r ($fruits ); echo "</br>" ; $fruits []="peach" ; print_r ($fruits ); echo "</br>" ; $fruits2 = array ('blueberry' , 'grape' ); print_r (array_merge ($fruits ,$fruits2 )); echo "</br>" ; print_r (array_reverse ($fruits )); echo "</br>" ; print_r (array_keys ($fruits )); echo "</br>" ; print_r (array_values ($fruits )); echo "</br>" ; echo "根据值搜索键名:" .array_search ("grape" ,$fruits2 ); echo "</br>" ; $fruits2 [1 ]="apricot" ; print_r ("修改数组元素值:" .$fruits2 ); echo "</br>" ; var_dump ("检查数组中是否存在某个元素:" .in_array ("apple" ,$fruits )); echo "</br>" ; echo "数组长度:" .count ($fruits ); echo "</br>" ; var_dump (empty ($fruits ));
PHP数组特点
可以整数下标或者字符串下标
不同下标可以混合存在
数组元素的顺序以放入顺序为准,跟下标无关
数字下标的自增长性
从0开始自动增长,如果中间手动下标出现较大的,那么后面的自增长元素从最大的值+1开始
特殊值下标的自动转换
PHP中数组元素没有类型限制
PHP中数组元素没有长度限制
PHP中的数组是很大的数据,所以存储位置是堆区,为当前数组分配一块连续的内存.
1 2 3 4 5 <?php $arr1 [false ]=false ; $arr1 [true ]=true ; $arr1 [null ]=null ; var_dump ($arr1 );
数组遍历
数组遍历:普通数组数据的访问都是通过数组元素的下标来实现访问,如果说数组中所有的数据都需要依次输出出来,就需要我们使用到一些简化的规则来实现自动获取下标以及输出数组元素.
1 2 3 4 5 6 7 $arr = array (0 =>array ('name' =>'Tom' ),1 =>array ('name' =>'Jim' )); $arr [0 ]; $arr [1 ]['name' ];
foreach 遍历原理
foreach遍历的原理:本质是数组的内部有一颗指针,默认是指向数组元素的第一个元素,foreach就是利用指针去获取数据,同时移动指针.
1 2 3 4 5 6 7 foreach ($arr , as $k => $v ){ }
遍历语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?php $arr = ['a' => 'aaa' , 'b' => 'bbb' , 'c' => 'ccc' ];foreach ($arr as $key => $value ) { echo $key . '<br/>' ; } echo "--------" ;echo "</br>" ;foreach ($arr as $val ) { echo $val . '<br/>' ; }
for循环遍历数组
for循环:基于已知边界条件(起始和结束)然后有条件的变化(规律) 因此:for循环遍历数组有对应条件
获取数组长度:count(数组)得到数组元素的长度
要求数组元素的下标是规律的数字
1 2 3 4 5 6 7 8 $arr = array (1 , 2 , 3 , 4 , 5 , 6 , 7 , 10 );$len = count ($arr );for ($i = 0 ; $i < $len ; $i ++) { echo 'key is :' , $i , ' and value is :' , $arr [$i ], '</br>' ; }
数组排序函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 1 . 排序函数:对数组元素进行排序,都是安装ASCII码进行比较,可以进行英文比较sort ():顺序排序(下标重排)asort ():升序排序(对键排序)rsort ():逆序排序asor ():顺序排序(下标保留)arsort ():逆序排序ksort ():顺序排序:按照键名(下标)krsort ():逆序排序shuffle ():随机打乱数组元素,数组下标会重排2 . 指针函数reset ():重置指针,将数组指针回到首位end ():重置指针,将数组指针指到最后一个元素next ():指针下移,取得下一个元素的值prev ():指针上移,取得上一个元素的值current ():获取当前指针对应的元素值key ():获取当前指针对应的下标值注意事项:next和prev会移动指针,有可能导致指针移到最前或者最后(离开数组),导致数组不能使用,不能通过next和prev不能回到正确的位置.只能通过end或者reset进行指针重置 3 . 其他函数count ():统计数组中元素的数量array_push ():往数组中加入一个元素(数组后面)array_pop ():从数组中取出一个元素(数组后面)array_shift ():从数组中取出一个元素(数组前面)array_unshift ():从数组中加入一个元素(数组前面)PHP模拟数据结构: 栈:压栈,先进去后出来(FILO) $arr = array ();array_push ($arr ,3 );array_push ($arr ,2 );array_push ($arr ,1 );print_r ($arr );echo array_pop ($arr ),array_pop ($arr ),array_pop ($arr );结果: Array ( [0 ] => 3 [1 ] => 2 [2 ] => 1 ) 123 队列:排队,先进去的先出去(FIFO) $arr = array ();array_unshift ($arr ,3 );array_unshift ($arr ,2 );array_unshift ($arr ,1 );print_r ($arr );echo array_pop ($arr ),array_pop ($arr ),array_pop ($arr );arcray_reverse ():数组元素反过来in_array ():判断一个元素在数组中是否存在array_keys ():获取一个数组的所有下标,返回一个索引数组array_values ():获取一个数组的所有值,返回一个索引数组
九、PHP 循环 在日常编写代码时,经常需要让相同的代码块一次又一次地重复运行.我们可以在代码中使用循环语句来完成这个任务.
在 PHP 中,提供了下列循环语句:
while - 只要指定的条件成立,则循环执行代码块
do…while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环
for - 循环执行代码块指定的次数
foreach - 根据数组中每个元素来循环代码块
while 循环 while 循环将重复执行代码块,直到指定的条件不成立
1 2 3 4 5 条件初始化; while(条件表达式){ //条件表达式就是判断边界条件 循环体;//循环条件的变化 }
1 2 3 4 5 6 <?php $i = 1 ; while ($i <= 5 ) { echo "num is " . $i . "<br>" ; $i ++; }
do…while 语句
do-while:看着很像while,while首先进行条件判定然后执行循环体,有可能出现第一次就条件不满足,那么就会直接失败(循环体一次都不执行).
do-while就是先干了再说(先执行循环体).后判断条件(至少会执行一次循环体)
1 2 3 do{ 循环体; }while(条件表达式);
1 2 3 4 5 6 <?php $i =1 ; do { $i ++; echo "num " . $i . "<br>" ; }while ($i <=5 );
for 循环 for 循环用于您预先知道脚本需要运行的次数的情况
1 2 3 4 5 6 for(初始值;条件;增量){ //初始值:定义初始化条件,可以有多种赋值语句存在,使用逗号分隔即可 //条件:边界判定,限定循环执行的次数 //增量:用来执行条件变化 //循环体 }
参数:
初始值 :主要是初始化一个变量值,用于设置一个计数器(但可以是任何在循环的开始被执行一次的代码).
条件 :循环执行的限制条件.如果为 TRUE,则循环继续.如果为 FALSE,则循环结束.
增量 :主要用于递增计数器(但可以是任何在循环的结束被执行的代码).
上面的初始值和增量参数可为空,或者有多个表达式(用逗号分隔).
1 2 3 4 5 <?php for ($i =1 ; $i <=5 ; $i ++) { echo "num is " . $i . "<br>" ; }
foreach 循环 foreach 循环用于遍历数组,我们在数组那一章讲了
循环控制
中断控制和终止控制是用于控制程序流程的重要工具.
中断控制: 中断控制是指在程序执行过程中,根据某些条件或事件的发生,提前跳出当前代码块或循环,并转移到事先定义好的处理逻辑.中断控制可以帮助我们及时处理特定的情况,提高程序的灵活性和健壮性.
常见的中断控制包括使用break
关键字来中断循环或跳出代码块.break
语句可以用于终止当前的循环结构(例如for
、while
、do-while
)或switch
语句.
终止控制: 终止控制是指在程序执行过程中,根据某些条件或事件的发生,立即终止整个程序的执行.通常情况下,终止控制被视为异常情况的处理方式,用于在程序出现严重错误或无法继续执行时停止程序的运行.
在PHP中,我们可以使用exit
或die
函数来实现终止控制.这两个函数可以立即终止当前脚本的执行,并返回一个指定的退出码.它们还可以输出一条可选的终止消息.
在编写代码时,需要注意以下几点:
中断控制通常用于在满足特定条件时跳出循环或代码块,提前结束当前的执行流程.
终止控制应该谨慎使用,只在程序无法继续执行或出现严重错误的情况下才使用.过度使用终止控制可能会导致程序
结构混乱或在调试时难以追踪问题.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?php $i = 1 ; while ($i <= 100 ) { if ($i % 5 != 0 ) { $i ++; continue ; } echo $i ++, '<br/> ' ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php $i = 1 ; while ($i <= 100 ) { if ($i % 5 != 0 ) { $i ++; break ; } } echo $i ;
流程控制替代语法
流程控制替代语法:分支和循环结构的替代语法
PHP本身是嵌入到HTML中的脚本语言,需要在HTML中书写一些关于判断或者循环的结构语法,必须符合PHP标签规范,需要 HTML与 PHP进行混搭,如果使用原始的PHP代码那么会非常不美观.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <table border=1 > <?php for ($i = 1 ;$i < 10 ;$i ++){?> <tr> <?php for ($j = 1 ;$j < $i ;$j ++){?> <td> <?php echo $j .'*' .$i . '= ' .$i *$j ;?> </td> <?php }?> </tr> <?php } ?> </table> for (;;){ => for (;;):} =>endfor ; 如下: <table border=1 > <?php for ($i = 1 ;$i < 10 ;$i ++):?> <tr> <?php for ($j = 1 ;$j < $i ;$j ++):?> <td> <?php echo $j .'*' .$i . '= ' .$i *$j ;?> </td> <?php endfor ;?> </tr> <?php endfor ; ?> </table>
十、PHP 函数
PHP函数是一段封装了特定功能的可重复使用的代码块.它们可以接受参数并返回值,用于执行特定任务或实现特定操作.函数的使用可以大大提高代码的可读性、重用性和维护性.
在PHP中,你可以使用内置的函数,也可以自定义函数来满足特定的需求.内置函数如strlen()
用于获取字符串长度,array_push()
用于向数组末尾添加元素等等.通过自定义函数,你可以根据具体需求编写自己的函数,并在需要的时候调用它们.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 以下是PHP的内置函数,用于检测变量的数据类型,以及它们的语法、用法及相关注释的举例: 1 . is_array () bool is_array (mixed $var ) $var = array ('apple' , 'orange' , 'banana' );echo is_array ($var ) ? 'Array' : 'Not an Array' ; 2 . is_bool () bool is_bool (mixed $var )$var = false ;echo is_bool ($var ) ? 'Boolean' : 'Not a Boolean' ; 3 . is_float () bool is_float (mixed $var )$var = 1.234 ;echo is_float ($var ) ? 'Float' : 'Not a Float' ; 4 . is_int () bool is_int (mixed $var )$var = 3 ;echo is_int ($var ) ? 'Integer' : 'Not an Integer' ; 5 . is_null () bool is_null (mixed $var )$var = null ;echo is_null ($var ) ? 'NULL' : 'Not NULL' ; 6 . is_numeric () bool is_numeric (mixed $var )$var = '123' ;echo is_numeric ($var ) ? 'Numeric' : 'Not Numeric' ; 7 . is_object () bool is_object (mixed $var )$var = new stdClass ;echo is_object ($var ) ? 'Object' : 'Not an Object' ; 8 . is_resource () bool is_resource (mixed $var )$var = fopen ("text.txt" , "r" );echo is_resource ($var ) ? 'Resource' : 'Not a Resource' ; 9 . is_string () bool is_string (mixed $var )$var = "Hello World!" ;echo is_string ($var ) ? 'String' : 'Not a String' ;
使用函数可以将复杂的任务分解为更小的可管理单元,使代码更加模块化.这使得代码更易于理解、调试和修改.此外,PHP还提供了许多有用的内置函数和函数库,以便更方便地处理各种任务,如字符串处理、文件操作、数据库连接等.
为了使用函数,你需要先定义函数并指定函数名、参数列表和函数体.函数名应具有描述性,能够清楚地表达函数的功能.参数列表定义了函数接受的输入,而函数体则包含了要执行的代码.当需要使用函数时,只需调用函数并传递所需的参数即可.
创建 PHP 函数 1 2 3 4 5 6 <?php function functionName ([参数] ) { }
函数命名规范:
函数名不区分大小写
函数名使用英文,遵循规范
下划线不属于特殊符号
数字可以加在中间或者后面
不用特殊符号
命名的时候要有意义
遵循驼峰或者下划线
不能使用系统函数以及关键字作为函数名
如下创建一个输出一句话的函数:
1 2 3 4 5 6 <?php function echo_test ( ) { echo "PHP study hard !! " ; } echo_test ();
输出结果:
函数 - 添加参数
在PHP函数中,添加参数是指在函数定义时声明函数所需的输入.参数允许你向函数传递数据,使函数能够处理不同的输入并产生相应的输出.
在函数定义中,你可以指定零个或多个参数,每个参数由参数名和参数类型组成.参数名是用来在函数内部引用输入值的变量名,而参数类型则决定了该参数接受的数据类型.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?php function name ($names ) { echo $names . "<br>" ; } echo "My name is " .name ("php" ); echo "My sister's name is " .name ("Bob" ); echo "My brother's name is " .name ("Tony" ); echo "-------------------</br>" ; function type_name (string $type_names ) { var_dump ($type_names ); echo "</br>" ; echo $type_names . "</br>" ; } echo "My name is " .type_name ("php" ); echo "My sister's name is " .type_name (100 ); echo "My brother's name is " .type_name ("Tony" );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?php function greet ($name ,$age =100 ) { echo "Hello, " . $name .",年龄:" .$age ; } greet ("Guest" ); greet ("John" ,10 );
函数返回值
函数返回值是指函数执行完成后,将结果返回给调用者的值.
以下是一段介绍 PHP 函数中函数返回值的内容:
PHP 中的函数返回值允许你从函数中获取一个结果,并将该结果传递给调用函数的代码.使用函数返回值可以使函数更加灵活和实用,因为你可以利用函数的返回值来进行进一步的操作、处理和判断.
要在 PHP 中使函数返回一个值,你可以使用 return
语句.在函数的代码块中,当需要返回值时,可以使用 return
关键字后跟要返回的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?php function calculateSum ($num1 , $num2 ) { return $num1 + $num2 ; } $result = calculateSum (5 , 3 ); echo $result ."</br>" ; function getPersonInfo ( ): array { $name = "John" ; $age = 25 ; $occupation = "Developer" ; return array ($name , $age , $occupation ); } $info = getPersonInfo (); echo $info [0 ]."</br>" ; echo $info [1 ]."</br>" ; echo $info [2 ]."</br>" ;
回调函数 在PHP中,回调函数是一种可以作为参数传递给其他函数的函数.回调函数在函数内部被调用,允许在特定的时候执行自定义的代码逻辑.使用回调函数可以实现更灵活、可扩展的代码结构.
为什么使用回调函数? 使用回调函数的主要目的是将某些代码逻辑作为参数传递给其他函数,以便在特定的时候执行.这样做的好处包括:
提供了解耦的方式:回调函数将代码逻辑与主函数分离,使得代码更易于理解和维护.
增强了代码的灵活性:通过动态设置回调函数,可以根据需要改变函数的行为.
实现了代码的复用:可以将相同的回调函数应用于多个函数调用,避免了重复编写相似的代码.
如何使用回调函数? 使用回调函数需要注意以下几点:
定义回调函数:首先,需要定义一个函数,作为回调函数的具体实现.该函数可以是普通函数、类方法或匿名函数.
将回调函数作为参数传递:在调用支持回调的函数时,将回调函数作为参数传递给这些函数.确保回调函数的参数和返回值与被调用的函数要求的一致.
执行回调函数:当被调用的函数满足特定条件时,会在适当的时候执行传递的回调函数.
示例代码 回调函数示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?php function process ($data , $callback ) { $result = $callback ($data ); return $result ; } function myCallback ($value ) { return $value * 2 ; } $data = 10 ; $result = process ($data , 'myCallback' ); echo $result ;
可变函数 可变函数:当前有一个变量所保存到值,刚好是一个函数的名字,那么就可以使用变量+()
来充当函数名使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?php function display ( ) { echo __FUNCTION__ ."</br>" ; } $func = "display" ; display (); $func ();
可变函数在系统使用的过程中还是比较多的,尤其是使用很多系统函数的时候:需要用户在外部定义一个自定义函数,但是是需要传入到系统函数内部使用.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php function sys_function ($arg1 ,$arg2 ) { $age2 = $age2 + 10 ; return $arg1 ($arg2 ); } function user_function ($num ) { return $num * $num * $num * $num ; } sys_function ('user_function' ,10 );
匿名函数
在PHP中,匿名函数是一种没有明确命名的函数,也称为闭包函数.可以通过使用function()
语法来创建匿名函数.匿名函数通常用于以下场景: - 作为回调函数传递给其他函数.
在需要一个短暂的函数时,不必为其命名.
创建匿名函数的一般语法如下:
1 2 3 4 5 6 7 8 9 <?php $anonymous = function (parameters ) { };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <?php $sum = function ($a , $b ) { return $a + $b ; }; echo $sum (2 , 3 ); $numbers = [1 , 2 , 3 , 4 , 5 ]; $squared = array_map (function($number ) { return $number * $number ; }, $numbers ); print_r ($squared );
变量保存匿名函数,本质得到的是一个对象(closure)
1 2 3 4 5 6 7 <?php $sum = function ($a , $b ) { return $a + $b ; }; echo $sum (2 , 3 ); echo "</br>" ; var_dump ($sum );
闭包(Closure)
在PHP中,闭包是一种特殊的匿名函数,它可以在定义时捕获其周围作用域的变量,并且可以在后续的调用中访问和修改这些变量.闭包允许我们将函数作为一等公民来对待,可以将其作为参数传递给其他函数,也可以从其他函数中返回.
创建闭包 闭包的基本语法如下:
1 2 3 $closure = function ($arg1 , $arg2 , ... ) { };
通过使用 function
关键字和匿名函数的语法,我们可以创建一个闭包并将其赋值给变量 $closure
.闭包可以接收任意数量的参数,并且在函数体中执行相应的操作.
使用闭包 闭包可以像普通函数一样被调用,例如:
1 2 <?php $result = $closure ($value1 , $value2 );
在上述例子中,我们通过调用闭包 $closure
并传递参数 $value1
和 $value2
来获取结果 $result
.闭包会根据传入的参数执行函数体中的操作,并返回一个结果.
捕获变量 闭包不仅可以访问传递给它的参数,还可以捕获定义在其周围作用域中的变量.这意味着闭包可以在稍后的调用中访问和修改这些变量的值.
1 2 3 4 5 6 <?php $message = "Hello" ; $closure = function ($name ) use ($message ) { echo $message . ", " . $name ; }; $closure ("John" );
在上述例子中,闭包 $closure
捕获了定义在其周围作用域中的变量 $message
.在闭包内部,我们可以通过 use
关键字引用这个变量,并将其用于输出.
应用场景 闭包常常用于回调函数、事件处理程序和高阶函数等场景.它们可以帮助我们编写更灵活和可重用的代码,同时提供更好的封装性和代码组织方式.
闭包和匿名函数的区别 我们的匿名函数明明可以传参为什么还要用到闭包呢? 匿名函数确实可以传递参数,但是闭包是一种特殊的匿名函数,它具有捕获周围作用域变量的能力.
闭包与普通匿名函数的区别在于,闭包可以在定义时捕获其周围作用域中的变量,并且可以在后续的调用中访问和修改这些变量的值.这使得闭包在某些情况下更为灵活和强大.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php function createMultiplier ($factor ) { return function ($number ) use ($factor ) { return $number * $factor ; }; } $double = createMultiplier (2 ); $result = $double (10 ); echo $result ;
通过这种方式,闭包可以更灵活地操作作用域中的变量.
即使在定义闭包时,外部变量的值已经发生了改变,闭包仍然可以访问到最初捕获的变量值.
因此,捕获参数是指闭包在定义时绑定并保留对周围作用域变量的引用,以便在后续调用中使用,而传参是指直接向匿名函数传递参数来处理特定的操作.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php $factor = 2 ; $factor2 = 10 ; $greeting = function ($number ,$factor ) { return $number * $factor ; }; echo $greeting ($factor2 ,$factor ); echo "</br>" ; $factor = 10 ; echo "读的是新的值:" .$greeting ($factor2 ,$factor ); echo "</br>" ; $factor = 2 ; $multiplier = function ($number ) use ($factor ) { return $number * $factor ; }; $result = $multiplier (10 ); echo $result ; echo "</br>" ; $factor = 10 ; $result = $multiplier (10 ); echo '读的是最初的$factor值:' .$result ;
相关函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 字符串相关函数 1 . 转换函数: implode (),explode (),st_split () lmplode (连接方式,数组):将数组中的元素按照某个规则连接成一个字符串, explode (分割字符,目标字符串):将字符串按照某个格式进行分割,变成数组 str_split (字符串,字符长度):按照指定长度拆分字符串得到数组 2 . 截取函数: trim (),ltrim (), rtrim () trim (字符串,[指定字符]):本身默认是用来去除两边的空格(中间不行),但是也可以指定要去除的内容,是按照指定的内容循环去除两边有的内容:直到碰到一个不是目标字符为止. ltrim ():去除左边的空格 rtrim ():去除右边的空格 3 . 截取函数: substr (),strstr () substr (字符串,起始位置从0 开始[长度]):指定位置开始截取字符串,可以截取指定长度(不指定到最后) strstr (字符串,匹配字符):从指定位置开始,截取到最后(可以用来取文件后缀名) 4 . 大小转换函数: strtolower (),strtoupper (),ucfirst () strtolower: 全部小写 strtoupper: 全部大写 ucfirst: 首字母大写 5 . 查找函数: strpos (),strrpos () strpos ():判断字符在目标字符串中出现的位置(首次) strrpos ():判断字符在目标字符串中最后出现的位置 6 . 替换函数: str_replace () str_replace (匹配目标,替换的内容,字符串本身):将目标字符串中部分字符串进行替换, $str = '123a234a3b2a' ; str_replace ('a' ,'b' ,$str ); 7 . 格式化函数: printf (),sprintf ()printf/sprintf (输出字符串有占位符,顺序占位内容):格式化输出数据 $age = 50 ; $name = 'TOM' ; echo sprintf ("你好,今年我%d岁,我叫%s" ,$age ,$name ); 8 . 其他: str_repeat (),str_shuffle () str_repeat ():重复某个字符串N次 str_shuffle ():随机打乱字符串
十一、PHP日期处理 介绍
日期处理在 Web 开发中非常重要,PHP 提供了丰富的日期函数用于处理与日期和时间相关的操作.
获取当前日期和时间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?php echo date ('Y-m-d H:i:s' ); echo "</br>" ; echo time (); echo "</br>" ; echo strtotime ('2023-08-03 09:00:56' );
格式化日期和时间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 echo "</br>" ;echo date_format (new DateTime ('2023-08-03 09:00:56' ), 'Y-m-d H:i:s' ); echo "设置默认时区:" ;date_default_timezone_set ('Africa/Abidjan' );echo date ('Y-m-d H:i:s' );
日期计算 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <? PHP echo "</br>" ; date_default_timezone_set ('Asia/Shanghai' ); echo date ('Y-m-d H:i:s' ,strtotime ('+1 day' )); echo "</br>" ; $dateTime = new DateTime ('2023-08-02 17:30:00' ); $interval = new DateInterval ('P1D' ); $dateTime ->add ($interval ); echo $dateTime ->format ('Y-m-d H:i:s' ); echo "</br>" ; $dateTime1 = new DateTime ('2023-08-02' ); $dateTime2 = new DateTime ('2023-08-05' ); $interval = date_diff ($dateTime1 , $dateTime2 ); echo $interval ->format ('%R%a days' );
解析和输出日期字符串 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php echo "</br>--------解析和输出日期字符串--------</br>" ; print_r (date_parse ('2023-08-03 09:20:41' )); echo "</br>" ; setlocale (LC_TIME, 'zh_CN.utf8' ); echo strftime ('%Y年%m月%d日 %H:%M:%S' , time ());
实际应用示例 以下是一些实际应用示例,展示如何利用 PHP 日期函数处理日期和时间:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <?php echo "</br>实际应用示例</br>" ; echo $date = date ('Y-m-d' ); echo "</br>" ; $startDate = new DateTime ('2023-07-01' ); $endDate = new DateTime ('2023-07-10' ); $interval = date_diff ($startDate , $endDate ); echo $interval ->format ('%R%a days' ); echo "</br>" ; $dateString = '2023-08-02 17:30:00' ; $dateInfo = date_parse ($dateString ); echo "年份:" . $dateInfo ['year' ] . "<br>" ; echo "月份:" . $dateInfo ['month' ] . "<br>" ; echo "日期:" . $dateInfo ['day' ] . "<br>" ; echo "小时:" . $dateInfo ['hour' ] . "<br>" ; echo "分钟:" . $dateInfo ['minute' ] . "<br>" ; echo "秒钟:" . $dateInfo ['second' ] . "<br>" ;
总结 PHP 提供了丰富的日期处理函数,用于获取、格式化、计算和解析日期和时间.熟练掌握这些函数可以简化日期处理任务,提高开发效率.
十二、文件包含 文件包含简介
文件包含:在一个 PHP脚本中,需要将另外一个文件(PHP)包含进来,去合作完成一件事情.
文件包含的意义:
要么使用被包含文件中的内容,实现代码的共享(重用):向上包含(索要)
向上包含:在当前脚本要用某个代码之前包含别的文件
要么自己有东西可以给别的文件使用,实现代码的共享(重用):向下包含(给予)
向下包含:在自己有某个东西的时候,需要别的脚本来显示(自己代码写完之后包含其他文件)
最大的作用:分工协作,每个脚本做的事情不一样,因此可以使用协作方式,让多个脚本共同完成一件事情
解耦和耦合 解耦和耦合是两个重要的概念.
解耦是指减少模块之间的依赖关系,使得软件的各个模块能够独立地进行修改、测试和维护. 耦合则是指模块之间的紧密关联程度,高耦合表示一个模块对其他模块的依赖程度较高. 解耦的好处包括:
提高可维护性:当一个模块独立于其他模块时,修改一个模块不会对其他模块产生影响,从而降低了维护的复杂性. 增强可测试性:独立的模块可以更容易地进行单元测试,而不需要涉及到其他模块. 促进团队合作:解耦可以使团队成员并行开发不同的模块,减少彼此之间的阻塞和依赖. 以下是一些常见的解耦策略:
使用接口或抽象类:通过定义接口或抽象类,模块之间只依赖于接口或抽象类而不是具体实现,从而实现解耦. 使用事件驱动架构:通过发布-订阅模式或观察者模式,模块之间通过事件进行通信,解耦了发送者和接收者. 使用依赖注入:将依赖关系从模块内部移动到外部,通过依赖注入容器来管理依赖关系,从而实现解耦. 使用消息队列:模块通过在消息队列中发送和接收消息进行通信,从而实现解耦. 另一方面,耦合度高的代码容易引发以下问题:
修改一个模块可能会影响到其他模块,导致意想不到的副作用. 难以进行单元测试,需要涉及到多个相关模块. 增加了代码的复杂性和维护成本.
文件包含四种形式
include
:包含文件
include_once
:系统会自动判断文件包含过程中,是否已经包含过(一个文件最多被包含一次)
require
:与include
相同
require_once
:与include_once
相同
文件包含使用 1 2 3 4 5 6 7 8 9 10 11 12 <?php include '文件名字' ; include ('文件名字' ); include 'include1.php' ; echo $a ; echo $b ; $a = 10 ; const PI = 3.14 ; include_once 'include4.php'
文件加载原理
在文件加载(include或者require)的时候,系统会自动将被包含文件中的代码相当于嵌入到当前文件中
加载位置:在哪加载,对应的文件中的代码嵌入的位置就是对应的include位置
在PHP中被包含的文件是单独进行编译的
包含实例 message.php 1 2 <?php $message = "php study hard!!!" ;
show.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8" > <title>SecHub</title> </head> <body> <p>努力学习</p> <?php include 'message.php' ;echo $message ;?> </body> </html>
区别总结
include()
函数:该函数会将指定文件包含到当前 PHP 文件中,并且执行包含的文件中的 PHP 代码.如果攻击者能够控制include()
函数的参数,就可以注入恶意代码并执行,从而利用文件包含漏洞.
require()
函数:该函数与include()
函数类似,也会将指定文件包含到当前PHP文件中,并且执行包含的文件中的 PHP 代码.如果攻击者能够控制require()
函数的参数,就可以注入恶意代码并执行,从而利用文件包含漏洞.
include_once()
和require_once()
函数:这两个函数与include()
函数和require()
函数类似,也会将指定文件包含到当前 PHP 文件中,并且执行包含的文件中的 PHP 代码.
不同之处在于,如果文件已经被包含过,则不会再次包含.攻击者可以利用这两个函数的特性,通过改变包含文件的路径,来实现文件包含漏洞.
1 2 3 4 5 6 <?php include ('login.php' ) echo 'include test final!' ; require ('login1.php' ) echo 'require test final!' ; ?>
十三、PHP 文件操作 简介 在 PHP 中,文件操作是一项非常重要的任务.它允许我们读取文件的内容、写入新的内容,以及对文件进行其他操作.PHP 提供了一组内置函数,使得文件操作变得简单而高效.
作用 文件操作在 Web 开发中有广泛的应用.它可以用于读取配置文件、日志记录、数据存储等场景.通过使用 PHP 的文件操作功能,我们可以方便地处理文件,实现各种需求.
使用场景
读取日志文件并进行数据分析和处理
从配置文件中读取各种设置和参数
将用户提交的表单数据写入到文件中
处理上传的文件,保存到指定目录
读取和修改 CSV、JSON、XML 等格式的数据文件
示例
模式
描述
r
只读.在文件的开头开始.
r+
读/写.在文件的开头开始.
w
只写.打开并清空文件的内容;如果文件不存在,则创建新文件.
w+
读/写.打开并清空文件的内容;如果文件不存在,则创建新文件.
a
追加.打开并向文件末尾进行写操作,如果文件不存在,则创建新文件.
a+
读/追加.通过向文件末尾写内容,来保持文件内容.
x
只写.创建新文件.如果文件已存在,则返回 FALSE 和一个错误.
x+
读/写.创建新文件.如果文件已存在,则返回 FALSE 和一个错误.
如果 fopen() 函数无法打开指定文件,则返回 0 (false)。
下面是一个示例,展示了如何使用 PHP 进行文件读写操作.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 <?php $filePath = 'D:\\Software\\phpstudy_pro\\WWW\\localhost\\example.txt' ;$file = fopen ($filePath , 'w' );if ($file ) { $newContent = "这是新的文件内容" ; fwrite ($file , $newContent ); fclose ($file ); echo "文件写入成功!" ; } else { echo "文件打开失败!" ; } $file = fopen ($filePath , 'r' );if ($file ) { $content = fread ($file , filesize ($filePath )); fclose ($file ); echo "文件内容:" ; echo nl2br ($content ); } else { echo "文件打开失败!" ; }
十四、PHP 目录操作 简介 在 Web 开发中,我们经常需要对文件夹(目录)进行操作,例如创建新文件夹、复制或移动文件夹、遍历目录等等.PHP 提供了一组内置函数,使得目录操作变得容易而高效.
作用 目录操作可以帮助我们处理文件的组织和管理.它允许我们创建、删除和重命名目录,查找文件和子目录,以及执行其他与目录相关的任务.通过使用 PHP 的目录操作功能,我们可以轻松地处理文件系统中的目录结构.
使用场景
创建项目文件夹和子文件夹
遍历目录并查找特定类型的文件
复制、移动或删除文件夹及其内容
计算文件夹的大小和文件数量
检查目录是否存在,如果不存在则创建
示例 下面是一个示例,展示了如何使用 PHP 进行目录操作.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 <?php $directoryPath = 'D:\\Software\\phpstudy_pro\\WWW\\localhost\\test' ;if (!is_dir ($directoryPath )) { mkdir ($directoryPath ); echo "目录创建成功!" ; } else { echo "目录已存在!" ; } $dir = opendir ($directoryPath ); echo "目录中的文件列表:" ;while (($file = readdir ($dir )) !== false ) { if ($file != "." && $file != ".." ) { echo $file . "<br>" ; } } closedir ($dir ); $newDirectoryPath = 'D:\\Software\\phpstudy_pro\\WWW\\localhost\\test_copy' ;if (is_dir ($directoryPath ) && !is_dir ($newDirectoryPath )) { mkdir ($newDirectoryPath ); recurse_copy ($directoryPath , $newDirectoryPath ); echo "目录复制成功!" ; } else { echo "目录复制失败!" ; } if (is_dir ($directoryPath )) { delete_directory ($directoryPath ); echo "目录删除成功!" ; } else { echo "目录不存在!" ; } function recurse_copy ($src , $dst ) { $dir = opendir ($src ); @mkdir ($dst ); while (($file = readdir ($dir )) !== false ) { if ($file != "." && $file != ".." ) { if (is_dir ($src . '/' . $file )) { recurse_copy ($src . '/' . $file , $dst . '/' . $file ); } else { copy ($src . '/' . $file , $dst . '/' . $file ); } } } closedir ($dir ); } function delete_directory ($dir ) { if (is_dir ($dir )) { $objects = scandir ($dir ); foreach ($objects as $object ) { if ($object != "." && $object != ".." ) { if (is_dir ($dir . "/" . $object )) { delete_directory ($dir . "/" . $object ); } else { unlink ($dir . "/" . $object ); } } } rmdir ($dir ); } }