arguments

函数的参数

函数的参数对函数来说可有可无,你可以不传递参数、一个参数或多个参数,主要看定义函数时规定的参数类型。给函数传递参数时,参数一定要以逗号作为分隔符分开传递,参数也可以是表达式列表,它们将从左向右依次求值。

按值传递参数

PHP 中的函数穿参默认是按值传递参数,也就是上一篇课程中所提出的示例。如果这个函数不接受任何参数,那这个函数的运行结果不会接受用户的任何改变要求,返回的值就是固定不变的。按值传递参数的函数使用和定义起来都很简单,上节课已经讲得很详细,这里不再赘述。

引用传递参数

还记得以前讲到的 引用变量 吗?函数也可以接受引用参数哟,他会在函数体内改变这个参数的值,免去了 return 这个操作,如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号 &,像这样:


function wow(&$string)
{
	$string .= 'php!';
}

$str = 'wow';
wow($str);
var_dump($str); // 输出 wowphp!
		

这里需要注意的是,使用引用变量作为参数的函数的参数,必须是一个变量。如果你要这么调用 echo wow('wow'); 是会报错的。

声明默认参数

在编写函数时,如果你接受参数并且想在没有参数的时候也可以运行,那么可以规定一个带有默认值参数的函数,它可以在调用者不传递参数的时候使用自己附带的默认参数:


function wow($string = 'wow')
{
	return $string .= 'php!';
}

// 直接调用函数
echo wow(); // 输出 wowphp!
echo wow(null); // 输出 php!
echo wow('Hello wow'); // 输出 Hello wowphp!
		

NULL 也算一个参数,向带有默认值的参数传递 NULL 会覆盖掉默认参数。

在声明一个带有默认参数的函数时,必须把默认参数放在所有非默认参数的最右边,否则,函数将不会按照预期的情况工作。请看以下对比:


// 错误的排序方式
function wow($string = 'wow', $type)
{
	return $string .= 'php is '. $type;
}

// 直接调用函数
echo wow('good'); // 程序报错: Too few arguments to function wow()

// 正确的排序方式:
function wow($type, $string = 'wow')
{
	return $string .= 'php is'. $type;
}

echo wow('good'); // 输出 wowphp is good
		
Type declarations

规定参数的类型

宽松模式

PHP5 起,你可以在函数参数前加上参数类型提示(在 PHP7 版本后将“提示”更换为“规定”,变得更为严格。)类型声明允许函数在调用时要求参数为特定类型。 如果给出的值类型不对,那么将会产生一个错误: 在 PHP5 中,这将是一个可恢复的致命错误,而在 PHP7 中将会抛出一个 TypeError 的异常。

最常见的规定参数的类型的方式如下:


function eachArr(array $args, int $key)
{
	return $args[$key];
}

$args = ['Java', 'PHP', 'Python'];
echo eachArr($args, 1); // 输出 PHP

// 如果传递参数有误
echo eachArr('string', 1); // 输出 Uncaught TypeError:
						   			 // Argument 1 passed to eachArr() must be
						   			 // of the type array string given
		

这里需要注意的是,只有在 PHP7 版本,才会支持 intboolfloatstring 类型的规定。

严格模式

默认情况下,如果能做到的话,PHP将会强迫错误类型的值转为函数期望的标量类型。 例如,一个函数的一个参数期望是 string,但传入的是 integer,最终函数得到的将会是一个 string 类型的值。

但是在某些特殊情况下,会强制要求一个变量的类型必须为规定的类型。比如金融部门要求所有数据类型都为字符串类型,或浮点型。你可以基于每一个文件开启严格模式。在严格模式中,只有一个与类型声明完全相符的变量才会被接受,否则将会抛出一个 TypeError。 唯一的一个例外是可以将 integer 传给一个期望 float 的函数。

使用 declare 语句和 strict_types 声明来启用严格模式。同时,作为副作用,启用严格模式同时也会影响返回值类型声明。


declare(strict_types=1);

function sum(int $a, int $b) {
    return $a + $b;
}

var_dump(sum(1, 2)); // 输出 3
var_dump(sum(1.5, 2.5)); // 报错
		
Type declarations

可变数量的参数类型

≥PHP5.6

如果你要定义一个不限定变量个数的函数,在 5.6 以后的版本可以使用 ... 来声明这个类型。比如,我想声明一个计算所有参数之和的函数,我不知道调用者会传递多少参数进来,那么我就这样声明:


function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4); // 输出 10
echo sum(30, 40); // 输出 70
		

如果是在 PHP 5.5 及更早版本中定义可变数量参数的函数,可以使用使用函数 func_num_args()func_get_arg(),和 func_get_args() 。 这三个函数相互配合也可以实现上面的功能,相关演示将会写在 PHP 内置函数的课程中,敬请关注。

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~