PHP 函数

在本教程中,你将学习如何在 PHP 中创建自己的自定义函数。

PHP 内置函数

函数是执行特定任务的自包含代码块。

PHP 拥有你可以在你的 PHP 脚本中直接调用执行特定任务的内部或内置函数的巨大集合,如 gettype()print_r()var_dump 等。

PHP 用户定义的函数

除了内置函数,PHP 还允许你定义自己的函数。这是一种创建可重用代码包的方法,可以执行特定任务,并且可以与主程序分开保存和维护。以下是使用函数的一些优点:

  • 函数减少了程序中代码的重复 - 函数允许你将常用的代码块提取到单个模块中。现在,你可以通过在脚本中的任何位置调用此函数来执行相同的任务,而无需一次又一次地复制和粘贴相同的代码块。
  • 函数使代码更易于维护 - 由于创建一次的函数可以多次使用,因此在函数内部进行的任何更改都会在所有位置自动实现,而不会触及多个文件。
  • 函数可以更容易地消除错误 - 当程序细分为函数时,如果发生任何错误,你确切知道导致错误的函数以及在何处找到错误。因此,修复错误变得更加容易。
  • 函数可以在其他应用程序中重用 - 因为函数与脚本的其余部分是分开的,只需包含包含这些函数的 php 文件,就可以很容易地在其他应用程序中重用相同的函数。

以下部分将向你展示如何轻松地在 PHP 中定义自己的函数。

PHP 创建和调用函数

创建自定义函数的基本语法可以通过以下方式获得:

function functionName(){ // Code to be executed } 

用户定义函数的声明以单词 function 开头,后跟要创建的函数的名称,后跟括号,即 (),最后将函数的代码放在大括号 {} 之间。

这是一个用户定义函数的简单示例,显示今天的日期:

<?php
// Defining function
function whatIsToday(){
    echo "Today is " . date('l', mktime());
}
// Calling function
whatIsToday();
?>

注意: 函数名称必须以字母或下划线字符开头,而不是数字,后面可跟更多的字母,数字或下划线字符。函数名称不区分大小写。

PHP 带参数的函数

定义函数以在运行时接受输入值时,可以指定参数。参数的作用类似于函数中的占位符变量; 它们在运行时被调用时提供给函数的值(称为参数)替换。

function myFunc($oneParameter, $anotherParameter){ // Code to be executed } 

你可以根据需要定义任意数量的参数。但是,对于你指定的每个参数,在调用函数时需要将相应的参数传递给函数。

以下示例中的 getSum() 函数将两个整数值作为参数,只需将它们相加,然后在浏览器中显示结果。

<?php
// Defining function
function getSum($num1, $num2){
  $sum = $num1 + $num2;
  echo "Sum of the two numbers $num1 and $num2 is : $sum";
}
 
// Calling function
getSum(10, 20);
?>

上面代码的输出将是:

Sum of the two numbers 10 and 20 is : 30

具有可选参数和默认值的函数

你还可以使用可选参数创建函数 - 只需插入参数名称,然后输入等号(=),后跟默认值,如下所示。

<?php
// Defining function
function customFont($font, $size=1.5){
    echo "<p style=\"font-family: $font; font-size: {$size}em;\">Hello, world!</p>";
}
 
// Calling function
customFont("Arial", 2);
customFont("Times", 3);
customFont("Courier");
?>

正如你所看到的,第三个调用 customFont() 不包括第二个参数。这会导致 PHP 引擎使用参数 $size 的默认值 1.5。

从函数返回值

函数可以使用 return 语句将值返回给调用函数的脚本。该值可以是任何类型,包括数组和对象。

<?php
// Defining function
function getSum($num1, $num2){
    $total = $num1 + $num2;
    return $total;
}
 
// Printing returned value
echo getSum(5, 10); // Outputs: 15
?>

函数不能返回多个值。但是,你可以通过返回数组来获得类似的结果,如以下示例所示。

<?php
// Defining function
function divideNumbers($dividend, $divisor){
    $quotient = $dividend / $divisor;
    $array = array($dividend, $divisor, $quotient);
    return $array;
}
 
// Assign variables as if they were an array
list($dividend, $divisor, $quotient) = divideNumbers(10, 2);
echo $dividend;  // Outputs: 10
echo $divisor;   // Outputs: 2
echo $quotient;  // Outputs: 5
?>

通过引用将参数传递给函数

在 PHP 中,有两种方法可以将参数传递给函数: *按值*和 *引用*。默认情况下,函数参数按值传递,这样如果函数中的参数值发生更改,则不会在函数外部受到影响。但是,要允许函数修改其参数,必须通过引用传递它们。

通过引用传递参数是通过在函数定义中的参数名称前加一个 & 符号来完成的,如下例所示:

<?php
/* Defining a function that multiply a number
by itself and return the new value */
function selfMultiply(&$number){
    $number *= $number;
    return $number;
}
 
$mynum = 5;
echo $mynum; // Outputs: 5
 
selfMultiply($mynum);
echo $mynum; // Outputs: 25
?>

PHP 变量范围

你可以在 PHP 脚本中的任何位置声明变量。但是,声明的位置决定了变量在 PHP 程序中的可见性范围,即可以使用或访问变量的位置。此可访问性称为*变量范围*。

默认情况下,函数内声明的变量是本地的,不能从该函数外部查看或操作它们,如下例所示:

<?php
// Defining function
function test(){
    $greet = "Hello World!";
    echo $greet;
}
 
test(); // Outputs: Hello World!
 
echo $greet; // Generate undefined variable error
?>

同样,如果你尝试访问或导入函数内部的外部变量,你将收到未定义的变量错误,如以下示例所示:

<?php
$greet = "Hello World!";
 
// Defining function
function test(){
    echo $greet;
}
 
test();  // Generate undefined variable error
 
echo $greet; // Outputs: Hello World!
?>

正如你在上面的示例中所看到的,函数内部声明的变量无法从外部访问,同样在函数内部声明的变量也无法在函数内部访问。这种分离降低了函数中变量受主程序中变量影响的可能性。

提示: 可以在不同函数中为变量重用相同的名称,因为局部变量只能由声明它们的函数识别。

全局关键字

可能存在需要将主程序中的变量导入函数的情况,反之亦然。在这种情况下,你可以在函数内部的变量之前使用 global 关键字。此关键字将变量转换为全局变量,使其在函数内部和外部都可见或可访问,如下例所示:

<?php
$greet = "Hello World!";
 
// Defining function
function test(){
    global $greet;
    echo $greet;
}
 
test(); // Outpus: Hello World!
echo $greet; // Outpus: Hello World!
 
// Assign a new value to variable
$greet = "Goodbye";
 
test(); // Outputs: Goodbye
echo $greet; // Outputs: Goodbye
?>

你将在 PHP 类和对象 章节中了解有关可见性和访问控制的更多信息。

创建递归函数

递归函数是一种一次又一次调用自身直到满足条件的函数。递归函数通常用于解决复杂的数学计算,或处理深层嵌套的结构,例如,打印深层嵌套数组的所有元素。

以下示例演示了递归函数的工作原理。

<?php
// Defining recursive function
function printValues($arr) {
    global $count;
    global $items;
    
    // Check input is an array
    if(!is_array($arr)){
        die("ERROR: Input is not an array");
    }
    
    /*
    Loop through array, if value is itself an array recursively call the
    function else add the value found to the output items array,
    and increment counter by 1 for each value found
    */
    foreach($arr as $a){
        if(is_array($a)){
            printValues($a);
        } else{
            $items[] = $a;
            $count++;
        }
    }
    
    // Return total count and values found in array
    return array('total' => $count, 'values' => $items);
}
 
// Define nested array
$species = array(
    "birds" => array(
        "Eagle",
        "Parrot",
        "Swan"
    ),
    "mammals" => array(
        "Human",
        "cat" => array(
            "Lion",
            "Tiger",
            "Jaguar"
        ),
        "Elephant",
        "Monkey"
    ),
    "reptiles" => array(
        "snake" => array(
            "Cobra" => array(
                "King Cobra",
                "Egyptian cobra"
            ),
            "Viper",
            "Anaconda"
        ),
        "Crocodile",
        "Dinosaur" => array(
            "T-rex",
            "Alamosaurus"
        )
    )
);
 
// Count and print values in nested array
$result = printValues($species);
echo $result['total'] . ' value(s) found: ';
echo implode(', ', $result['values']);
?>

注意: 创建递归函数时要小心,因为如果代码写得不正确,可能会导致函数调用无限循环。