ZetCode

PHP 函数

最后修改于 2025 年 2 月 16 日

在本文中,我们将介绍 PHP 函数。

函数是一段可重用的代码块,用于执行特定操作。函数执行特定任务。使用函数的好处是

函数有两种基本类型:内置函数和用户自定义函数。内置函数是 PHP 语言的一部分。例如:phpinforoundabs。用户自定义函数由应用程序程序员创建,以满足他们的需求。它们使用 function 关键字创建。

PHP 定义函数

函数使用 function 关键字创建。

simple.php
<?php

function displayVersion() {

    echo "This is PHP " . phpversion();
    echo "\n";
}

displayVersion();

function 关键字后面跟着函数名和圆括号。函数的正文位于大括号之间。我们说我们 调用 函数。如果我们调用一个函数,函数体内的语句将被执行。

displayVersion();

这行代码调用函数。

$ php simple.php 
This is PHP 8.1.2

PHP return 关键字

return 关键字用于从函数返回值。函数可以返回或不返回值。

returning.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 函数。此示例是为学习目的而创建的;在我们的实际程序中,我们始终更喜欢内置函数。

if ($x > $y) { 
    
    return $x;
} else {
    
    return $y;
}

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

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

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

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

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

PHP 函数参数

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

fahrenheit.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 fahrenheit.php 
212
32
86

PHP 隐式值

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

implicit_value.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";

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

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

PHP 可变数量的参数

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

... 运算符可用于创建可变函数。

variable_arguments1.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 方法,该方法可以接受可变数量的参数。该方法计算传递给该方法的值的总和。

$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";

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

$ php variable_arguments1.php 
6
10
15

variable_arguments2.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 函数命名参数

当我们使用命名参数时,参数的顺序无关紧要。

named_parameters.php
<?php 

function info($name, $occupation) {

    return "$name is a $occupation";
}


echo info(name: 'John Doe', occupation: 'gardener') . "\n";
echo info(occupation: 'gardener', name: 'John Doe') . "\n";

在示例中,我们两次调用 info,以不同的顺序传递参数。输出是正确的,因为我们使用了命名参数。

$ php simple.php 
John Doe is a gardener
John Doe is a gardener

PHP 静态变量

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

non_static.php
<?php

function nonstatic() {

    $value = 0;
    $value += 1;

    return $value;
}

nonstatic();
nonstatic();
nonstatic();
nonstatic();

echo nonstatic(), "\n";

在上面的例子中,我们有一个普通的非静态变量。每次调用该函数时,我们都会增加该变量。我们调用该函数 5 次。但是,非静态变量是为每次函数调用而初始化的。在 5 次函数调用后,$value 等于 1。

静态变量仅在第一次调用该函数时初始化。它们随后会保留其值。

static.php
<?php

function staticfun() {

    static $value = 0;
    $value += 1;

    return $value;
}

staticfun();
staticfun();
staticfun();
staticfun();

echo staticfun(), "\n";

在 5 次连续调用后,$value 等于 5。

$ php nonstatic.php 
1
$ php static.php 
5

PHP 匿名函数

匿名函数没有名称。

anonymous.php
<?php

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

$var();

我们将函数体分配给一个变量。只能通过此变量调用该函数。

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

注意右大括号后的分号。这是必需的,因为该结构是一个赋值。

$ php anonymous.php 
This is anonymous function

匿名函数通常与数组函数一起使用。

filter_vals.php
<?php 

$vals = [2, -1, 0, -4, -2, 5, 4];

$res = array_filter($vals, function($e) {
    return $e > 0;
});

echo implode(',', $res) . "\n";

在示例中,我们使用 array_filter 过滤数组的值。谓词函数使用匿名函数定义。

$ php filter_vals.php 
2,5,4

PHP 箭头函数

箭头函数为匿名函数提供了更简洁的语法。箭头函数使用 fn 关键字和胖箭头运算符 (=>) 创建。

arrow.php
$f1 = fn($x) => $x * $x;
$f2 = fn($x) => $x * $x * $x;

echo $f1(2) . "\n";
echo $f2(3) . "\n";

在示例中,我们定义了两个箭头函数。

$ PHP arrow.php
4
27

filter_vals2.php
<?php 

$vals = [2, -1, 0, -4, -2, 5, 4];

$res = array_filter($vals, fn ($e) => $e > 0);

echo implode(',', $res) . "\n";

使用箭头函数,代码更紧凑。

按值和引用传递参数

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

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

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

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

swap1.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";

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

$a = 4;
$b = 7;

一开始,这两个变量被初始化。

swap($a, $b);

我们调用 swap 函数。该函数将 $a$b 变量作为参数。

$temp = $a;
$a = $b;
$b = $temp;

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

$ 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

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";

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

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

该示例与上一个示例几乎相同。除了 & 符号。

$ 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

function factorial($n) {

    if ($n==0) {
    
        return 1;
    } else {
    
        return $n * factorial($n - 1);
    }
}

echo factorial(4), "\n";
echo factorial(10), "\n";

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

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

在阶乘函数的正文内部,我们使用修改后的参数调用阶乘函数。该函数调用自身。

$ php recursion.php 
24
3628800

这些是结果。

PHP 全局和局部变量

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

scope1.php
<?php

$value = 1;

function simple() {
    
    var_dump($value);
}

simple();

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

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

$value 变量在 simple 函数中为 NULL。

scope2.php
<?php

$value = 4;

function simple() {
    $value = 3;
    echo $value, "\n";
}

simple();

echo $value, "\n";

在这个例子中,我们有两个同名的变量。它们不会冲突,因为它们存在于不同的范围内。

$ php scope2.php 
3
4

函数内部的值是 3,函数外部的值是 4。

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

scope3.php
<?php

$value = 1;

function simple() {

    global $value;
    $value = 2;
}

echo $value, "\n";
simple();
echo $value, "\n";

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

$ php scope3.php 
1
2

$valuesimple 函数内部被成功修改。

来源

PHP 语言参考

在本文中,我们介绍了 PHP 函数。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有十多年的编程教学经验。

列出所有 PHP 教程。