原文: https://zetcode.com/lang/php/functions/

在 PHP 编程教程的这一部分中,我们讨论函数。

函数是较大程序中的一段代码。 该函数执行特定任务。 使用函数的优点是:

  • 减少代码重复
  • 将复杂的问题分解成更简单的部分
  • 提高代码的清晰度
  • 重用代码
  • 信息隐藏

有两种基本类型的函数。 内置函数和用户定义的函数。 内置函数是 PHP 语言的一部分。 示例是:phpinfo()round()abs()。 用户定义的函数由应用员创建,以满足其需求。 它们是使用function关键字创建的。

PHP 定义函数

使用function关键字创建一个函数。

simple.php

  1. <?php
  2. function displayVersion() {
  3. echo "this is PHP " . phpversion();
  4. echo "\n";
  5. }
  6. displayVersion();

function关键字后跟带有圆括号的函数名称。 函数的主体位于大括号之间。 我们说我们将称为函数。 如果我们调用一个函数,则会执行函数体内的语句。

  1. displayVersion();

该行代码调用该函数。

  1. $ php simple.php
  2. this is PHP 5.5.9-1ubuntu4.14

在这里,我们看到了脚本的结果。

PHP return关键字

return关键字用于从函数返回值。 函数可能会也可能不会返回值。

returning.php

  1. <?php
  2. function maximum($x, $y) {
  3. if ($x > $y) {
  4. return $x;
  5. } else {
  6. return $y;
  7. }
  8. }
  9. $a = 23;
  10. $b = 32;
  11. $val = maximum($a, $b);
  12. echo "The max of $a and $b is $val \n";

我们有一个maximum()函数。 它返回两个数字的最大值。 我们无法将其命名为max,因为已经有内置的max()函数。 创建此示例是出于学习目的; 我们始终希望在现实世界的程序中使用内置函数。

  1. if ($x > $y) {
  2. return $x;
  3. } else {
  4. return $y;
  5. }

如果$x变量大于$y,则返回$x。 否则,我们返回$y

  1. $val = maximum($a, $b);

maximum()函数返回的值分配给$val变量。

  1. echo "The max of $a and $b is $val \n";

我们将两个数字的最大值打印到控制台。

PHP 函数参数

大多数函数接受参数。 参数是发送到函数的值。 函数处理值,并可能返回一些结果。

fahrenheit.php

  1. <?php
  2. function FTC($c) {
  3. return $c * 9/5 + 32;
  4. }
  5. echo FTC(100);
  6. echo "\n";
  7. echo FTC(0);
  8. echo "\n";
  9. echo FTC(30);
  10. echo "\n";

在我们的示例中,我们将华氏温度转换为摄氏温度。 FTC()函数接受一个参数$c,即摄氏温度。

  1. $ php fahrenheit.php
  2. 212
  3. 32
  4. 86

PHP 隐式值

PHP 函数中的参数可能具有隐式值。 如果未提供任何值,则使用隐式值。

implicit_value.php

  1. <?php
  2. function power($a, $b=2) {
  3. if ($b == 2) {
  4. return $a * $a;
  5. }
  6. $value = 1;
  7. for ($i = 0; $i < $b; $i++) {
  8. $value *= $a;
  9. }
  10. return $value;
  11. }
  12. $v1 = power(5);
  13. $v2 = power(5, 4);
  14. echo "5^2 is $v1 \n";
  15. echo "5^4 is $v2 \n";

在这里,我们创建了幂函数。 该函数有一个带有隐式值的参数。 我们可以使用一个或两个参数来调用该函数。

  1. $ php implicit_value.php
  2. 5^2 is 25
  3. 5^4 is 625

PHP 可变参数数量

一个函数可以接受可变数量的参数。 换句话说,有时我们不知道将有多少参数传递给该函数。 func_get_args()函数返回一个包含函数的参数列表的数组。

从 PHP 5.6 开始,...运算符可用于创建可变函数。

variable_arguments1.php

  1. <?php
  2. function sum(...$nums) {
  3. $sum = 0;
  4. foreach ($nums as $n) {
  5. $sum += $n;
  6. }
  7. return $sum;
  8. }
  9. echo sum(1, 2, 3) . "\n";
  10. echo sum(1, 2, 3, 4) . "\n";
  11. echo sum(1, 2, 3, 4, 5) . "\n";

我们创建一个sum()方法,该方法可以使用可变数量的参数。 该方法计算传递给该方法的值的总和。

  1. $sum = 0;
  2. foreach ($args as $n) {
  3. $sum += $n;
  4. }
  5. return $sum;

我们计算并返回值的总和。

  1. echo sum(1, 2, 3) . "\n";
  2. echo sum(1, 2, 3, 4) . "\n";
  3. echo sum(1, 2, 3, 4, 5) . "\n";

我们将三个,四个和五个值传递给sum()函数。

  1. $ php variable_arguments1.php
  2. 6
  3. 10
  4. 15

这是输出。

variable_arguments2.php

  1. <?php
  2. function sum() {
  3. $args = func_get_args();
  4. $sum = 0;
  5. foreach ($args as $n) {
  6. $sum += $n;
  7. }
  8. return $sum;
  9. }
  10. echo sum(1, 2, 3) . "\n";
  11. echo sum(1, 2, 3, 4) . "\n";
  12. echo sum(1, 2, 3, 4, 5) . "\n";

现在,使用func_get_args()函数创建相同的示例。

PHP 静态变量

静态变量是已静态分配的变量,其生存期遍及整个程序运行。 默认的局部变量不会在函数的连续调用中保留其值。

non_static.php

  1. <?php
  2. function nonstatic() {
  3. $value = 0;
  4. $value += 1;
  5. return $value;
  6. }
  7. nonstatic();
  8. nonstatic();
  9. nonstatic();
  10. nonstatic();
  11. echo nonstatic(), "\n";

在上面的示例中,我们有一个普通的非静态变量。 每次调用函数时,我们都会增加变量。 我们调用该函数 5 次。 但是,对于函数的每次调用都会启动非静态变量。 在 5 个函数调用之后,$value等于 2。

首次调用函数时,静态变量仅启动一次。 之后,他们保留自己的值。

static.php

  1. <?php
  2. function staticfun() {
  3. static $value = 0;
  4. $value += 1;
  5. return $value;
  6. }
  7. staticfun();
  8. staticfun();
  9. staticfun();
  10. staticfun();
  11. echo staticfun(), "\n";

连续 5 次通话后,$value等于 5。

  1. $ php nonstatic.php
  2. 2
  3. $ php static.php
  4. 6

PHP 匿名函数

匿名函数没有名称。

anonymous.php

  1. <?php
  2. $var = function() {
  3. echo "This is anonymous function\n";
  4. };
  5. $var();

我们将函数主体分配给变量。 只能通过此变量来调用函数。

  1. $var = function() {
  2. echo "This is anonymous function\n";
  3. };

注意右花括号后的分号。 这是必需的,因为构造是分配。

  1. $ php anonymous.php
  2. This is anonymous function

这是示例的输出。

通过值和引用传递参数

PHP 支持两种将参数传递给函数的方式。 默认方式是按值传递参数。 当我们按值传递参数时,该函数仅适用于值的副本。 当我们处理大量数据时,这可能会导致性能开销。

当我们通过引用传递值时,该函数会收到对实际值的引用。 修改后,原始值会受到影响。 这种传递值的方式更加节省时间和空间。 另一方面,它更容易出错。

我们应该使用哪种方式传递参数? 这取决于实际情况。 假设我们有一组数据,即员工工资。 如果我们要计算数据的某些统计信息,则无需修改它们。 我们通过值。 如果我们处理大量数据,并且计算速度至关重要,则可以引用。 如果我们要修改数据,例如进行一些减薪或加薪,我们可以引用一下。

以下两个示例涵盖了这两个概念。

swap1.php

  1. <?php
  2. function swap($a, $b) {
  3. $temp = $a;
  4. $a = $b;
  5. $b = $temp;
  6. echo "inside swap function:\n";
  7. echo "\$a is $a \n";
  8. echo "\$b is $b \n";
  9. }
  10. $a = 4;
  11. $b = 7;
  12. echo "outside swap function:\n";
  13. echo "\$a is $a \n";
  14. echo "\$b is $b \n";
  15. swap($a, $b);
  16. echo "outside swap function:\n";
  17. echo "\$a is $a \n";
  18. echo "\$b is $b \n";

交换函数在$a$b变量之间交换数字。 原始变量不受影响。

  1. $a = 4;
  2. $b = 7;

最初,这两个变量被启动。

  1. swap($a, $b);

我们称为swap()函数。 该函数将$a$b变量作为参数。

  1. $temp = $a;
  2. $a = $b;
  3. $b = $temp;

swap()函数内部,我们更改值。 请注意,$a$b变量是在本地定义的。 它们仅在swap()函数内部有效。

  1. $ php swap1.php
  2. outside swap function:
  3. $a is 4
  4. $b is 7
  5. inside swap function:
  6. $a is 7
  7. $b is 4
  8. outside swap function:
  9. $a is 4
  10. $b is 7

输出显示原始变量不受影响。

下一个代码示例通过引用将值传递给函数。 原始变量在swap()函数内更改。

swap2.php

  1. <?php
  2. function swap(&$a, &$b) {
  3. $temp = $a;
  4. $a = $b;
  5. $b = $temp;
  6. echo "Inside the swap function:\n";
  7. echo "\$a is $a \n";
  8. echo "\$b is $b \n";
  9. }
  10. $a = 4;
  11. $b = 7;
  12. echo "Outside the swap function:\n";
  13. echo "\$a is $a \n";
  14. echo "\$b is $b \n";
  15. swap($a, $b);
  16. echo "Outside the swap function:\n";
  17. echo "\$a is $a \n";
  18. echo "\$b is $b \n";

我们使用&字符通过引用传递值。

  1. function swap(&$a, &$b) {
  2. ...
  3. }

这个例子几乎与前面的例子相同。 除&字符外。

  1. $ php swap2.php
  2. Outside the swap function:
  3. $a is 4
  4. $b is 7
  5. Inside the swap function:
  6. $a is 7
  7. $b is 4
  8. Outside the swap function:
  9. $a is 7
  10. $b is 4

在这里我们看到swap()函数确实改变了变量的值。

PHP 函数递归

在数学和计算机科学中,递归是一种定义函数的方法,其中所定义的函数在其自己的定义内应用。 换句话说,递归函数调用自身以完成其工作。 递归是迭代的替代方法。 递归是函数式语言中的主要方法。

一个典型的例子是阶乘的计算。

recursion.php

  1. <?php
  2. function factorial($n) {
  3. if ($n==0) {
  4. return 1;
  5. } else {
  6. return $n * factorial($n - 1);
  7. }
  8. }
  9. echo factorial(4), "\n";
  10. echo factorial(10), "\n";

在此代码示例中,我们计算两个数字的阶乘。

  1. return $n * factorial($n - 1);

在阶乘函数的主体内部,我们使用经过修改的参数调用阶乘函数。 该函数调用自身。

  1. $ php recursion.php
  2. 24
  3. 3628800

这些就是结果。

PHP 全局和局部变量

接下来,我们将讨论 PHP 中变量的范围。 范围是可以引用变量的范围。 当我们使用函数时,有两个基本范围:全局范围和局部范围。 局部作用域也称为函数作用域。

scope1.php

  1. <?php
  2. $value = 1;
  3. function simple() {
  4. var_dump($value);
  5. }
  6. simple();

在函数体内定义的变量不能在函数内引用。

  1. $ php scope1.php
  2. PHP Notice: Undefined variable: value in /home/janbodnar/prog/php/functions/scope1.php on line 7
  3. NULL

simple()函数中的$value变量为NULL

scope2.php

  1. <?php
  2. $value = 4;
  3. function simple() {
  4. $value = 3;
  5. echo $value, "\n";
  6. }
  7. simple();
  8. echo $value, "\n";

在此示例中,我们有两个具有相同名称的变量。 它们不会冲突,因为它们存在于不同的范围内。

  1. $ php scope2.php
  2. 3
  3. 4

该值在函数内部为 3,在函数外部为 4。

在下一个示例中,我们将在函数内部修改一个值。

scope3.php

  1. <?php
  2. $value = 1;
  3. function simple() {
  4. global $value;
  5. $value = 2;
  6. }
  7. echo $value, "\n";
  8. simple();
  9. echo $value, "\n";

我们使用global关键字来引用在函数主体外部定义的变量。

  1. $ php scope3.php
  2. 1
  3. 2

$value已在simple()函数内成功修改。

在 PHP 教程的这一部分中,我们介绍了 PHP 函数。