🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# PHP 中的函数 > 原文: [https://zetcode.com/lang/php/functions/](https://zetcode.com/lang/php/functions/) 在 PHP 编程教程的这一部分中,我们讨论函数。 函数是较大程序中的一段代码。 该函数执行特定任务。 使用函数的优点是: * 减少代码重复 * 将复杂的问题分解成更简单的部分 * 提高代码的清晰度 * 重用代码 * 信息隐藏 有两种基本类型的函数。 内置函数和用户定义的函数。 内置函数是 PHP 语言的一部分。 示例是:`phpinfo()`,`round()`或`abs()`。 用户定义的函数由应用员创建,以满足其需求。 它们是使用`function`关键字创建的。 ## PHP 定义函数 使用`function`关键字创建一个函数。 `simple.php` ```php <?php function displayVersion() { echo "this is PHP " . phpversion(); echo "\n"; } displayVersion(); ``` `function`关键字后跟带有圆括号的函数名称。 函数的主体位于大括号之间。 我们说我们将称为函数。 如果我们调用一个函数,则会执行函数体内的语句。 ```php displayVersion(); ``` 该行代码调用该函数。 ```php $ php simple.php this is PHP 5.5.9-1ubuntu4.14 ``` 在这里,我们看到了脚本的结果。 ## PHP `return`关键字 `return`关键字用于从函数返回值。 函数可能会也可能不会返回值。 `returning.php` ```php <?php function maximum($x, $y) { if ($x > $y) { return $x; } else { return $y; } } $a = 23; $b = 32; $val = maximum($a, $b); echo "The max of $a and $b is $val \n"; ``` 我们有一个`maximum()`函数。 它返回两个数字的最大值。 我们无法将其命名为`max`,因为已经有内置的`max()`函数。 创建此示例是出于学习目的; 我们始终希望在现实世界的程序中使用内置函数。 ```php if ($x > $y) { return $x; } else { return $y; } ``` 如果`$x`变量大于`$y`,则返回`$x`。 否则,我们返回`$y`。 ```php $val = maximum($a, $b); ``` `maximum()`函数返回的值分配给`$val`变量。 ```php echo "The max of $a and $b is $val \n"; ``` 我们将两个数字的最大值打印到控制台。 ## PHP 函数参数 大多数函数接受参数。 参数是发送到函数的值。 函数处理值,并可能返回一些结果。 `fahrenheit.php` ```php <?php function FTC($c) { return $c * 9/5 + 32; } echo FTC(100); echo "\n"; echo FTC(0); echo "\n"; echo FTC(30); echo "\n"; ``` 在我们的示例中,我们将华氏温度转换为摄氏温度。 `FTC()`函数接受一个参数`$c`,即摄氏温度。 ```php $ php fahrenheit.php 212 32 86 ``` ## PHP 隐式值 PHP 函数中的参数可能具有隐式值。 如果未提供任何值,则使用隐式值。 `implicit_value.php` ```php <?php function power($a, $b=2) { if ($b == 2) { return $a * $a; } $value = 1; for ($i = 0; $i < $b; $i++) { $value *= $a; } return $value; } $v1 = power(5); $v2 = power(5, 4); echo "5^2 is $v1 \n"; echo "5^4 is $v2 \n"; ``` 在这里,我们创建了幂函数。 该函数有一个带有隐式值的参数。 我们可以使用一个或两个参数来调用该函数。 ```php $ php implicit_value.php 5^2 is 25 5^4 is 625 ``` ## PHP 可变参数数量 一个函数可以接受可变数量的参数。 换句话说,有时我们不知道将有多少参数传递给该函数。 `func_get_args()`函数返回一个包含函数的参数列表的数组。 从 PHP 5.6 开始,`...`运算符可用于创建可变函数。 `variable_arguments1.php` ```php <?php function sum(...$nums) { $sum = 0; foreach ($nums as $n) { $sum += $n; } return $sum; } echo sum(1, 2, 3) . "\n"; echo sum(1, 2, 3, 4) . "\n"; echo sum(1, 2, 3, 4, 5) . "\n"; ``` 我们创建一个`sum()`方法,该方法可以使用可变数量的参数。 该方法计算传递给该方法的值的总和。 ```php $sum = 0; foreach ($args as $n) { $sum += $n; } return $sum; ``` 我们计算并返回值的总和。 ```php echo sum(1, 2, 3) . "\n"; echo sum(1, 2, 3, 4) . "\n"; echo sum(1, 2, 3, 4, 5) . "\n"; ``` 我们将三个,四个和五个值传递给`sum()`函数。 ```php $ php variable_arguments1.php 6 10 15 ``` 这是输出。 `variable_arguments2.php` ```php <?php function sum() { $args = func_get_args(); $sum = 0; foreach ($args as $n) { $sum += $n; } return $sum; } echo sum(1, 2, 3) . "\n"; echo sum(1, 2, 3, 4) . "\n"; echo sum(1, 2, 3, 4, 5) . "\n"; ``` 现在,使用`func_get_args()`函数创建相同的示例。 ## PHP 静态变量 静态变量是已静态分配的变量,其生存期遍及整个程序运行。 默认的局部变量不会在函数的连续调用中保留其值。 `non_static.php` ```php <?php function nonstatic() { $value = 0; $value += 1; return $value; } nonstatic(); nonstatic(); nonstatic(); nonstatic(); echo nonstatic(), "\n"; ``` 在上面的示例中,我们有一个普通的非静态变量。 每次调用函数时,我们都会增加变量。 我们调用该函数 5 次。 但是,对于函数的每次调用都会启动非静态变量。 在 5 个函数调用之后,`$value`等于 2。 首次调用函数时,静态变量仅启动一次。 之后,他们保留自己的值。 `static.php` ```php <?php function staticfun() { static $value = 0; $value += 1; return $value; } staticfun(); staticfun(); staticfun(); staticfun(); echo staticfun(), "\n"; ``` 连续 5 次通话后,`$value`等于 5。 ```php $ php nonstatic.php 2 $ php static.php 6 ``` ## PHP 匿名函数 匿名函数没有名称。 `anonymous.php` ```php <?php $var = function() { echo "This is anonymous function\n"; }; $var(); ``` 我们将函数主体分配给变量。 只能通过此变量来调用函数。 ```php $var = function() { echo "This is anonymous function\n"; }; ``` 注意右花括号后的分号。 这是必需的,因为构造是分配。 ```php $ php anonymous.php This is anonymous function ``` 这是示例的输出。 ## 通过值和引用传递参数 PHP 支持两种将参数传递给函数的方式。 默认方式是按值传递参数。 当我们按值传递参数时,该函数仅适用于值的副本。 当我们处理大量数据时,这可能会导致性能开销。 当我们通过引用传递值时,该函数会收到对实际值的引用。 修改后,原始值会受到影响。 这种传递值的方式更加节省时间和空间。 另一方面,它更容易出错。 我们应该使用哪种方式传递参数? 这取决于实际情况。 假设我们有一组数据,即员工工资。 如果我们要计算数据的某些统计信息,则无需修改它们。 我们通过值。 如果我们处理大量数据,并且计算速度至关重要,则可以引用。 如果我们要修改数据,例如进行一些减薪或加薪,我们可以引用一下。 以下两个示例涵盖了这两个概念。 `swap1.php` ```php <?php function swap($a, $b) { $temp = $a; $a = $b; $b = $temp; echo "inside swap function:\n"; echo "\$a is $a \n"; echo "\$b is $b \n"; } $a = 4; $b = 7; echo "outside swap function:\n"; echo "\$a is $a \n"; echo "\$b is $b \n"; swap($a, $b); echo "outside swap function:\n"; echo "\$a is $a \n"; echo "\$b is $b \n"; ``` 交换函数在`$a`和`$b`变量之间交换数字。 原始变量不受影响。 ```php $a = 4; $b = 7; ``` 最初,这两个变量被启动。 ```php swap($a, $b); ``` 我们称为`swap()`函数。 该函数将`$a`和`$b`变量作为参数。 ```php $temp = $a; $a = $b; $b = $temp; ``` 在`swap()`函数内部,我们更改值。 请注意,`$a`和`$b`变量是在本地定义的。 它们仅在`swap()`函数内部有效。 ```php $ php swap1.php outside swap function: $a is 4 $b is 7 inside swap function: $a is 7 $b is 4 outside swap function: $a is 4 $b is 7 ``` 输出显示原始变量不受影响。 下一个代码示例通过引用将值传递给函数。 原始变量在`swap()`函数内更改。 `swap2.php` ```php <?php function swap(&$a, &$b) { $temp = $a; $a = $b; $b = $temp; echo "Inside the swap function:\n"; echo "\$a is $a \n"; echo "\$b is $b \n"; } $a = 4; $b = 7; echo "Outside the swap function:\n"; echo "\$a is $a \n"; echo "\$b is $b \n"; swap($a, $b); echo "Outside the swap function:\n"; echo "\$a is $a \n"; echo "\$b is $b \n"; ``` 我们使用`&`字符通过引用传递值。 ```php function swap(&$a, &$b) { ... } ``` 这个例子几乎与前面的例子相同。 除&字符外。 ```php $ php swap2.php Outside the swap function: $a is 4 $b is 7 Inside the swap function: $a is 7 $b is 4 Outside the swap function: $a is 7 $b is 4 ``` 在这里我们看到`swap()`函数确实改变了变量的值。 ## PHP 函数递归 在数学和计算机科学中,递归是一种定义函数的方法,其中所定义的函数在其自己的定义内应用。 换句话说,递归函数调用自身以完成其工作。 递归是迭代的替代方法。 递归是函数式语言中的主要方法。 一个典型的例子是阶乘的计算。 `recursion.php` ```php <?php function factorial($n) { if ($n==0) { return 1; } else { return $n * factorial($n - 1); } } echo factorial(4), "\n"; echo factorial(10), "\n"; ``` 在此代码示例中,我们计算两个数字的阶乘。 ```php return $n * factorial($n - 1); ``` 在阶乘函数的主体内部,我们使用经过修改的参数调用阶乘函数。 该函数调用自身。 ```php $ php recursion.php 24 3628800 ``` 这些就是结果。 ## PHP 全局和局部变量 接下来,我们将讨论 PHP 中变量的范围。 范围是可以引用变量的范围。 当我们使用函数时,有两个基本范围:全局范围和局部范围。 局部作用域也称为函数作用域。 `scope1.php` ```php <?php $value = 1; function simple() { var_dump($value); } simple(); ``` 在函数体内定义的变量不能在函数内引用。 ```php $ php scope1.php PHP Notice: Undefined variable: value in /home/janbodnar/prog/php/functions/scope1.php on line 7 NULL ``` `simple()`函数中的`$value`变量为`NULL`。 `scope2.php` ```php <?php $value = 4; function simple() { $value = 3; echo $value, "\n"; } simple(); echo $value, "\n"; ``` 在此示例中,我们有两个具有相同名称的变量。 它们不会冲突,因为它们存在于不同的范围内。 ```php $ php scope2.php 3 4 ``` 该值在函数内部为 3,在函数外部为 4。 在下一个示例中,我们将在函数内部修改一个值。 `scope3.php` ```php <?php $value = 1; function simple() { global $value; $value = 2; } echo $value, "\n"; simple(); echo $value, "\n"; ``` 我们使用`global`关键字来引用在函数主体外部定义的变量。 ```php $ php scope3.php 1 2 ``` `$value`已在`simple()`函数内成功修改。 在 PHP 教程的这一部分中,我们介绍了 PHP 函数。