概述
函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线
函数名是大小写无关的,不过在调用函数的时候,使用其在定义时相同的形式是个好习惯
PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数
函数的定义<?phpfunction foo($arg_1, $arg_2, /* ..., */ $arg_n){ echo "Example function.\n"; return $retval;}?>
当一个函数是有条件被定义时,必须在调用函数之前定义
<?php $makefoo = true;/* 不能在此处调用foo()函数, 因为它还不存在,但可以调用bar()函数。*/bar();if ($makefoo) { function foo() { echo "I don't exist until program execution reaches me.\n"; }}/* 现在可以安全调用函数 foo()了, 因为 $makefoo 值为真 */if ($makefoo) foo();function bar(){ echo "I exist immediately upon program start.\n";}?>
函数中的函数
<?phpfunction foo(){ function bar() { echo "I don't exist until foo() is called.\n"; }}/* 现在还不能调用bar()函数,因为它还不存在 */foo();/* 现在可以调用bar()函数了,因为foo()函数 的执行使得bar()函数变为已定义的函数 */bar();?>函数的参数
默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。
如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号 &
<?phpfunction add_some_extra(&$string){ $string .= 'and something extra.';}$str = 'This is a string, ';add_some_extra($str);echo $str; // outputs 'This is a string, and something extra.'?>
注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧
默认值必须是常量表达式,不能是诸如变量,类成员,或者函数调用等
<?phpfunction makecoffee($type = "cappuccino"){ return "Making a cup of $type.\n";}echo makecoffee();echo makecoffee(null);echo makecoffee("espresso");?>
还允许使用数组 array 和特殊类型 NULL 作为默认参数
<?phpfunction makecoffee($types = array("cappuccino"), $coffeeMaker = NULL){ $device = is_null($coffeeMaker) ? "hands" : $coffeeMaker; return "Making a cup of ".join(", ", $types)." with $device.\n";}echo makecoffee();echo makecoffee(array("cappuccino", "lavazza"), "teapot");?>
在 PHP 5.6 及以上的版本中,由 ... 语法实现可变数量的参数列表
<?phpfunction sum(...$numbers) { $acc = 0; foreach ($numbers as $n) { $acc += $n; } return $acc;}echo sum(1, 2, 3, 4);?>
在PHP5.5及更早版本,可以用func_num_args(), func_get_arg()和 func_get_args()实现
func_num_args()返回参数的个数
<?phpfunction foo(){ $numargs = func_num_args(); echo "Number of arguments: $numargs\n";}foo(1, 2, 3); ?>
func_get_args()返回一个包含函数参数列表的数组
<?phpfunction sum() { $acc = 0; foreach (func_get_args() as $n) { $acc += $n; } return $acc;}echo sum(1, 2, 3, 4);?>
func_get_arg()返回参数列表的某一项,参数从0开始
<?phpfunction foo(){ $numargs = func_num_args(); echo "Number of arguments: $numargs<br />\n"; if ($numargs >= 2) { echo "Second argument is: " . func_get_arg(1) . "<br>\n"; }}foo (1, 2, 3);?>返回值
如果省略了 return,则返回值为 NULL
函数不能返回多个值,但可以通过返回一个数组来得到类似的效果
可变函数这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它
<?phpfunction foo() { echo "In foo()<br />\n";}function bar($arg = '') { echo "In bar(); argument was '$arg'.<br>\n";}// 使用 echo 的包装函数function echoit($string){ echo $string;}$func = 'foo';$func(); // This calls foo()$func = 'bar';$func('test'); // This calls bar()$func = 'echoit';$func('test'); // This calls echoit()?>匿名函数
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。
<?phpecho preg_replace_callback('~-([a-z])~', function ($match) { return strtoupper($match[1]);}, 'hello-world');// 输出 helloWorld?>
匿名函数赋给一个变量,最后也要加上分号:
<?php $greet = function($name){ printf("Hello %s\r\n", $name);};$greet('World');$greet('PHP');?>
闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去
<?php $message = 'hello';// 没有 "use"$example = function () { var_dump($message);};echo $example(); // NULL// 继承 $message$example = function () use ($message) { var_dump($message);};echo $example(); // hello// Inherited variable's value is from when the function// is defined, not when called$message = 'world';echo $example(); // hello// Reset message$message = 'hello';// Inherit by-reference$example = function () use (&$message) { var_dump($message);};echo $example(); // hello// The changed value in the parent scope// is reflected inside the function call$message = 'world';echo $example(); // world// Closures can also accept regular arguments$example = function ($arg) use ($message) { var_dump($arg . ' ' . $message);};$example("hello"); // hello world?>
版权声明:本文为博主原创文章,未经博主允许不得转载。