0x01 变量作用域
1. 全局变量
在函数作用域之外定义的变量都是全局变量。全局变量分为普通的全局变量和超全局变量,他们之间的基本区别是:是否由用户定义;超全局变量是由系统预定义的变量,可以直接使用,有个容易的辨识特征:全大写字母构成的语义话变量。例如:
// 全局变量 $name = '缘'; $word = '今天又是充满希望的一天'; // 超全局变量 $_GET['name']; $GLOBALS['word']; function echo_name($name){ return $name .', '.$word; }
注意:
(1) 大多数的超全局变量是由’$_ ’开头的,但$GLOBALS没有下划线,它的作用是:它本身是一个数组,然后把所有用户自定义全局变量作为数组元素存储在数组中,键是变量名,值是变量所赋予的值。
(2) 在函数中,超全局变量可以直接使用,但普通的全局变量却不能直接使用,如果要进行使用:
a. 作为形式参数传入函数中
$name = '缘'; function echo_name($name){ return $name; }
但要注意,在函数中改变通过形参传进来的全局变量是无效的。因为这样改变参数的值相当于改变了一个在函数中定义的于全局变量同名的变量,这两个变量除了变量名一样之外并没有关联。例如:
$name = '缘'; $word = '今天又是充满希望的一天'; function echo_name($name,$word){ return $name .', '.$word; } print_r(echo_name($name,$word)); echo '<br>'; print_r($word);
由效果图可以看出,虽然return回来的值发生了改变,但$word的真实值却没有发生变化。那下面讨论下该如何改变
b. 通过声明或超全局变量
$name = '缘'; $word = '今天又是充满希望的一天'; $word2 = '要好好学习'; function echo_name($name,$word){ global $word; //$GLOBALS['word'] = '今天学习了吗?'; $word = '今天学习了吗?'; return $name .', '. $word .', '. $GLOBALS['word2']; } print_r(echo_name($name,$word)); echo '<br>'; print_r($word);
通过global对变量进行声明或者直接使用$GLOBALS['key'] ,就可以在在函数中对全局变量进行修改。
2. 局部变量
简单的理解:在函数中进行声明的变量(没经过其他方法修饰的)就是局部变量。它的作用域只在函数中,出了函数就访问不到了。
0x02 函数的参数与默认参数
在定义时使用的是形式参数,在调用时使用的是实际参数:
// 形式参数 function echo_name($name,$word){ global $word; $word = '今天学习了吗?'; return $name .', '. $word .', '. $GLOBALS['word2']; } // 实际参数 print_r(echo_name($name,$word)); echo '<br>'; print_r($word);
在调用函数时需要提供参数,但我们可以通过设置默认参数,在没有传入参数时不至于报错,同时可以提高复用率。
值得注意的是:默认参数应该写在最后
$a = 100; function num($a , $b=110){ return $c = $a + $b; } echo num($a);
0x03 参数函数与剩余参数
func_num_args():可以获取当前函数传入的参数个数;
func_get_args():这是一个数组,可以将传入的参数组成一个数组,下标从0开始
function arg(){ $num = func_num_args(); $arr = func_get_args(); foreach($arr as $v){ echo $v . '<br>'; } print_r(func_get_args()[2].'<br>'); return $num; } echo '总共'.arg(1,2,3,4,5).'个参数';
下面讨论剩余参数的用法:
顾名思义,分配完参数后的剩余参数。他用‘...’进行标识,将剩余参数放入一个数组中。
function number($a,$b,...$c){ print_r($c); // array_sum()计算数组中每个元素的和 return array_sum($c); } echo '<br>'.number(1,2,3,4,5);
0x04 使用剩余参数并实现计算不定参数的乘积
下面是主要代码以及注释:
function product($a,$b,...$c){ // 第一个参数为数组,后面都是要塞进数组的参数,会塞到数组的最后 array_push($c,$a,$b); // array_unshift($c,$a,$b); //和 array_push()的效果类似,但会塞到数组的开头 //array_pop($c); //弹出(删除)数组的最后一个元素 //计算数组里每个元素的乘积 return array_product($c); } echo product(1,2,3,4,5);
0x05 总结
1. 写了函数要调用函数才会生效。
2. 注意变量的作用域,当使用了默认参数要注意放在最后,如果放在前面可能会导致变量值覆盖,导致传递的参数不够而报错。