PHP 函数
在本教程中,您将学习如何在 PHP 中创建自己的自定义函数。
PHP 内建函数
函数是执行特定任务的自包含代码块。
PHP 拥有大量内部或内置函数,您可以直接在 PHP 脚本中调用这些函数来执行特定任务,例如 gettype()
, print_r()
, var_dump
等。
请查看 PHP 参考部分以获取有用的 PHP 内置函数的完整列表。
PHP 用户定义函数
除了内置函数外,PHP 还允许您定义自己的函数。 它是一种创建可重用代码包的方法,这些代码包执行特定任务,并且可以与主程序分开保存和维护。 以下是使用函数的一些优点:
- 函数减少了程序中代码的重复 — 函数允许您将常用的代码块提取到单个组件中。 现在,您可以通过在脚本中的任意位置调用此函数来执行相同的任务,而无需一次又一次地复制和粘贴相同的代码块。
- 函数使代码更易于维护 — 由于一次创建的函数可以多次使用,因此函数内部所做的任何更改都会自动在所有地方实现,而无需触及多个文件。
- 功能更容易消除错误 — 当程序被细分为函数时,如果发生任何错误,您就可以确切地知道是什么函数导致了错误以及在哪里找到它。 因此,修复错误变得容易得多。
- 函数可以在其他应用程序中重复使用 — 由于函数与脚本的其余部分是分开的,因此只需包含包含这些函数的 php 文件,就可以轻松地在其他应用程序中重用相同的函数。
以下部分将向您展示如何轻松地在 PHP 中定义自己的函数。
创建和调用函数
创建自定义函数的基本语法可以通过以下方式给出:
// 要执行的代码
}
用户定义函数的声明以单词 function
开头,后跟要创建的函数的名称,后跟括号,即 ()
,最后将函数的代码放在大括号 之间 {}
。
这是一个用户定义函数的简单示例,它显示今天的日期:
<?php
// 定义函数
function whatIsToday(){
echo "Today is " . date('l', mktime());
}
// 调用函数
whatIsToday();
?>
注意:函数名称必须以字母或下划线字符开头,不能以数字开头,可选地后跟多个字母、数字或下划线字符。 函数名称不区分大小写。
带参数的函数
您可以在定义函数以在运行时接受输入值时指定参数。 参数的作用类似于函数中的占位符变量; 它们在运行时被调用时提供给函数的值(称为参数)替换。
// 要执行的代码
}
您可以定义任意数量的参数。 但是,对于您指定的每个参数,在调用该函数时都需要将相应的参数传递给该函数。
以下示例中的 getSum()
函数将两个整数值作为参数,只需将它们相加,然后在浏览器中显示结果。
<?php
// 定义函数
function getSum($num1, $num2){
$sum = $num1 + $num2;
echo "Sum of the two numbers $num1 and $num2 is : $sum";
}
// 调用函数
getSum(10, 20);
?>
上述代码的输出将是:
提示: 参数是传递给函数的值,参数是函数中接收参数的变量。 然而,在通常的用法中,这些术语是可以互换的,即参数是参数是参数。
具有可选参数和默认值的函数
您还可以使用可选参数创建函数 — 只需插入参数名称,后跟等号 (=
),然后是默认值,如下所示。
<?php
// 定义函数
function customFont($font, $size=1.5){
echo "<p style=\"font-family: $font; font-size: {$size}em;\">Hello, world!</p>";
}
// 调用函数
customFont("Arial", 2);
customFont("Times", 3);
customFont("Courier");
?>
如您所见,对 customFont()
的第三次调用不包含第二个参数。 这会导致 PHP 引擎使用 $size
参数的默认值 1.5。
从函数返回值
函数可以使用 return 语句将值返回给调用该函数的脚本。 该值可以是任何类型,包括数组和对象。
<?php
// 定义函数
function getSum($num1, $num2){
$total = $num1 + $num2;
return $total;
}
// Printing returned value
echo getSum(5, 10); // Outputs: 15
?>
一个函数不能返回多个值。 但是,您可以通过返回一个数组来获得类似的结果,如以下示例所示。
<?php
// 定义函数
function divideNumbers($dividend, $divisor){
$quotient = $dividend / $divisor;
$array = array($dividend, $divisor, $quotient);
return $array;
}
// 像数组一样分配变量
list($dividend, $divisor, $quotient) = divideNumbers(10, 2);
echo $dividend; // Outputs: 10
echo $divisor; // Outputs: 2
echo $quotient; // Outputs: 5
?>
通过引用将参数传递给函数
在 PHP 中有两种方法可以将参数传递给函数:按值和按引用。 默认情况下,函数参数是按值传递的,因此如果函数内的参数值发生更改,它不会在函数外受到影响。 但是,要允许函数修改其参数,它们必须通过引用传递。
通过引用传递参数是通过在函数定义中的参数名称前加上一个与号 (&
) 来完成的,如下面的示例所示:
<?php
/* 定义一个乘以数字的函数
自行返回新值 */
function selfMultiply(&$number){
$number *= $number;
return $number;
}
$mynum = 5;
echo $mynum; // Outputs: 5
selfMultiply($mynum);
echo $mynum; // Outputs: 25
?>
了解变量作用域
但是,您可以在 PHP 脚本中的任何位置声明变量。 但是,声明的位置决定了变量在 PHP 程序中的可见性范围,即可以使用或访问变量的位置。 这种可访问性称为变量作用域。
默认情况下,函数内声明的变量是局部变量,无法从该函数外部查看或操作它们,如下例所示:
<?php
// 定义函数
function test(){
$greet = "Hello World!";
echo $greet;
}
test(); // Outputs: Hello World!
echo $greet; // Generate undefined variable error
?>
同样,如果您尝试访问或导入函数内部的外部变量,您将收到未定义变量错误,如下例所示:
<?php
$greet = "Hello World!";
// 定义函数
function test(){
echo $greet;
}
test(); // 生成未定义变量错误
echo $greet; // Outputs: Hello World!
?>
正如您在上面的示例中看到的,在函数内部声明的变量无法从外部访问,同样,在函数外部声明的变量在函数内部也无法访问。 这种分离减少了函数中的变量受主程序中的变量影响的机会。
提示: 可以在不同的函数中为变量重用相同的名称,因为局部变量只能被声明它们的函数识别。
global 全局关键字
可能存在需要将变量从主程序导入函数的情况,反之亦然。 在这种情况下,您可以在函数内的变量之前使用 global
关键字。 该关键字将变量转换为全局变量,使其在函数内部和外部都可见或可访问,如下例所示:
<?php
$greet = "Hello World!";
// 定义函数
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
// 定义递归函数
function printValues($arr) {
global $count;
global $items;
// Check input is an array
if(!is_array($arr)){
die("ERROR: Input is not an array");
}
/*
遍历数组,如果值本身是一个数组递归调用
函数将找到的值添加到输出项数组中,
并为找到的每个值将计数器加 1
*/
foreach($arr as $a){
if(is_array($a)){
printValues($a);
} else{
$items[] = $a;
$count++;
}
}
// 返回数组中的总计数和值
return array('total' => $count, 'values' => $items);
}
// 定义嵌套数组
$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"
)
)
);
// 计算和打印嵌套数组中的值
$result = printValues($species);
echo $result['total'] . ' value(s) found: ';
echo implode(', ', $result['values']);
?>
注意:创建递归函数时要小心,因为如果代码编写不当,可能会导致函数调用的无限循环。