5 创建可以接受个数可变的参数的函数
5.1 func_num_args 的使用
返回参数的个数
function mean_num() { $sum = 0; $size = func_num_args() ; for ($i=0; $i < $size ; $i++) { $sum += func_get_arg($i); } $average = $sum / $size; $average = round($average,2); return $average; } $mean = mean_num(96,93,97); var_dump($mean);
5.2 func_get_args的使用
返回参数的副本
function byVal($arg) { echo '原本1 : ', var_export(func_get_args()), PHP_EOL; $arg = '新参数1'; echo '修改后1 : ', var_export(func_get_args()), PHP_EOL; } function byRef(&$arg) { echo '原本2 : ', var_export(func_get_args()), PHP_EOL; $arg = '新参数2'; echo '修改后2 : ', var_export(func_get_args()), PHP_EOL; } $arg = '旧参数'; byVal($arg); byRef($arg);
计算平均数的另一种方法
function mean_get() { $sum = 0; $numbers = func_get_args(); $size = count($numbers) ; for ($i=0; $i < $size ; $i++) { $sum += $numbers[$i]; } $average = $sum / $size; $average = round($average,2); return $average; } $mean = mean_get(96,93,97); var_dump($mean);
6 返回变量的引用
过返回变量引用来允许函数外部代码修改变量值。这可以通过使用两个符号(&)作为函数参数类型声明来实现。
function &pc_array_find_value($needle, &$haystack) { foreach ($haystack as $key => $value) { //返回对变量的引用 if ($needle == $value) return $haystack[$key]; } } $artists = array('王菲','谢霆锋','The Doors'); $html = &pc_array_find_value('谢霆锋',$artists); var_dump($html);//string(9) "谢霆锋" var_dump($artists); $html = '窦唯'; var_dump($artists);
返回值必须是对变量的引用,因为返回给一个非变量不具有任何逻辑上的意义。
7 返回多个值
function time_parts($time) { return explode(':', $time); } list($hour, $minute, $second) = time_parts('12:35:56'); var_dump($hour); var_dump($minute); var_dump($second);
8 跳跃选择返回的值
function time_parts($time) { return explode(':', $time); } list(, $minute, ) = time_parts('12:35:56'); var_dump($hour); var_dump($minute); var_dump($second);
9 返回失败信息
记得用 !==就可以了
10 调用可变函数
10.1 使用call_user_func()
function get_file($fileName) { return file_get_contents($fileName); } $function = 'get_file'; $fileName = '6-08.php'; //第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。 $text = call_user_func($function,$fileName); var_dump($text);
10.1 使用call_user_func_array()
function put_file($fileName, $content) { return file_put_contents($fileName, $content); } $action = $_GET['action']; if ($action == 'get'){ $fileName = 'get_file'; $args = array('log.txt'); }else{ $fileName = 'put_file'; $args = array('log.txt','川普领先哈里斯'); } $rs = call_user_func_array($fileName,$args); var_dump($rs);
function logf() { $date = date("Y-m-d H:i:s"); $args = func_get_args(); return "$date:".call_user_func_array('sprintf',$args).PHP_EOL; } $log = logf("<a href='%s'>%s</a>",'http://www.baidu.com','百度'); echo $log;
11 在函数内部访问全局变量
11.1 基础使用
/** * 在函数内部访问全局变量 * @param $fruit * @return void */ $chew_count = 3; function eat_fruit() { global $chew_count; for ($i = 0; $i < $chew_count; $i++) { // echo $i . "<br>"; } } eat_fruit(); $chew_count2 = 3; function eat_fruit2() { for ($i = 0; $i < $GLOBALS['chew_count2']; $i++) { // echo $i . "<br>"; } } eat_fruit2();
输出结果
11.2 更有效管理全局变量的方式
$age = 10; $myGlobal = 'age'; global $$myGlobal; var_dump($GLOBALS); unset($GLOBALS[$myGlobal]); var_dump($GLOBALS);
第一个var_dump($GLOBALS);
第二个var_dump($GLOBALS);
12 创建动态函数
$arr = array(3, 2, 5, 6, 1); usort($arr,create_function('$a,$b','return strnatcmp($a,$b);')); var_dump($arr); echo "<br>"; $arr2 = array(3, 2, 5, 6, 1); usort($arr,function ($a,$b){ return strnatcmp($a,$b); }); var_dump($arr);
其实没啥用,不如用匿名函数,效果也是一样的