PHP学习之函数
一、用户自定义函数
函数的命名规则:函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。可以用正则表达式表示为:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*。
注意:函数无需在调用之前被定义,除非是下面两个例子中函数是有条件被定义时。(函数可以是先定义再调用,但不是必须的 ,也可以先调用再定义,如下例中bar()函数;有条件的函数必须是先定义再调用,例如,foo函数,其定义是有条件的,所以必须满足条件才能被调用!)
还有一种是函数中的函数:如下例子中
注意:PHP 中的所有函数和类都具有全局作用域,可以定义在一个函数之内而在之外调用,反之亦然。PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。注意: 函数名是大小写无关的,不过在调用函数的时候,使用其在定义时相同的形式是个好习惯。在 PHP 中可以调用递归函数。
二、函数的参数
通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表。参数是从左向右求值的。PHP 支持按值传递参数(默认),通过引用传递参数以及默认参数。也支持可变长度参数列表。
通过引用传递参数:
默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号 &:
默认参数
PHP 还允许使用数组 array 和特殊类型 NULL
作为默认参数,例如:
补充:is_null()函数用于检测变量是否为 NULL。如果指定变量为 NULL,则返回 TRUE,否则返回 FALSE。
补充:join()函数返回一个由数组元素组合成的字符串。是 implode() 函数的别名。join() 函数接受两种参数顺序。但是由于历史原因,explode() 是不行的,您必须保证 separator 参数在 string 参数之前才行。join() 函数的 separator 参数是可选的。但是为了向后兼容,推荐您使用两个参数。语法:join(separator,array)。参数:separator,可选。规定数组元素之间放置的内容。默认是 ""(空字符串);array,必需。要组合为字符串的数组。
运行结果:
注意:默认值必须是常量表达式,不能是诸如变量,类成员,或者函数调用等。注意:当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作。
注意: 自 PHP 5 起,传引用的参数也可以有默认值。
类型声明
类型声明允许函数在调用时要求参数为特定类型。 如果给出的值类型不对,那么将会产生一个错误: 在PHP 5中,这将是一个可恢复的致命错误,而在PHP 7中将会抛出一个TypeError异常。为了指定一个类型声明,类型应该加到参数名前。这个声明可以通过将参数的默认值设为NULL
来实现允许传递NULL
。严格类型
默认情况下,如果能做到的话,PHP将会强迫错误类型的值转为函数期望的标量类型。 例如,一个函数的一个参数期望是string,但传入的是integer,最终函数得到的将会是一个string类型的值。可以基于每一个文件开启严格模式。在严格模式中,只有一个与类型声明完全相符的变量才会被接受,否则将会抛出一个TypeError。 唯一的一个例外是可以将integer传给一个期望float的函数。可变数量的参数列表
PHP 在用户自定义函数中支持可变数量的参数列表。在 PHP 5.6 及以上的版本中,由 ... 语法实现;在 PHP 5.5 及更早版本中,使用函数 func_num_args(),func_get_arg(),和 func_get_args() 。三、返回值
值通过使用可选的返回语句返回。可以返回包括数组和对象的任意类型。返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行。注意:如果省略了 return,则返回值为 NULL
。
函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符 &:
四、可变函数
PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。//可变函数示例
header("Content-type: text/html; charset=utf-8");
function 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的值和函数foo( )同名。
$func( );//这会调用foo( )函数(即,变量值与函数同名的变量后加( )会调用同名函数)
$func = 'bar';//变量$func的值和函数bar( )同名。
$func('test');//这里会调用bar( )函数
$func = 'echoit';//变量$func的值和函数echoit( )同名。
$func('test');//这里会调用echoit( )函数
?>