在本教程中,您将学习如何在PHP中创建自己的自定义函数。
函数是执行特定任务的独立代码块。
PHP有一个巨大的集合内置函数,你可以在你的PHP脚本中直接调用执行特定的任务,如:gettype(),print_r(),var_dump等。
请查看PHP参考部分,以获得有用的PHP内置函数的完整列表。
除了内置函数,PHP还允许您定义自己的函数。这是创建执行特定任务的可重用代码包的一种方法,并且可以与主程序分开保存和维护。以下是使用函数的一些优点:
函数减少了程序中代码的重复 - 函数允许您将常用的代码块提取到单个组件中。现在,您可以通过在脚本中的任何位置调用此函数来执行相同的任务,而不必反复复制和粘贴相同的代码块。
函数使代码的维护更加容易 - 由于一次创建函数可以多次使用,因此在函数内部进行的任何更改都会在所有位置自动实现,而无需修改多个文件。
通过函数可以更轻松地消除错误 - 将程序细分为函数时,如果发生任何错误,您将确切知道是哪个函数导致了错误以及在哪里可以找到它。因此,修复错误变得容易得多。
可以在其他应用程序中重用功能 - 由于函数与脚本的其余部分是分开的,因此仅通过包含包含这些函数的php文件,就可以在其他应用程序中轻松重复使用相同的功能。
下一节将向您展示如何轻松地在PHP中定义自己的函数。
创建自定义函数的基本语法可以给出:
function functionName(){ //要执行的代码 }
用户定义函数的声明以单词function开头,后跟要创建的函数的名称,再后跟括号,即(),最后将函数的代码放在大括号之间{ }。
这是一个用户定义函数的简单示例,其中显示了今天的日期:
<?php //定义函数 function whatIsToday(){ echo "Today is " . date('l', mktime()); } //调用函数 whatIsToday(); ?>测试看看‹/›
注意:函数名称必须以字母或下划线字符开头,而不以数字开头,还可以选择后面跟有更多字母,数字或下划线字符。函数名称不区分大小写。
您可以在定义函数以在运行时接受输入值时指定参数。 参数的工作方式类似于函数中的占位符变量;它们在运行时被调用时提供给函数的值(称为参数)替换。
function myFunc($oneParameter,$anotherParameter){ //要执行的代码 }
您可以根据需要定义任意多个参数。 但是,对于您指定的每个参数,在调用函数时需要将相应的参数传递给该函数。
以下示例中的getSum()函数将两个整数值作为参数,只需将它们加在一起,然后在浏览器中显示结果。
<?php //定义函数 function getSum($num1, $num2){ $sum = $num1 + $num2; echo "两个数字$num1和$num2的和是 : $sum"; } //调用函数 getSum(10, 20); ?>测试看看‹/›
上面代码的输出将是:
两个数字10和20的和是 : 30
提示:参数是您传递给函数的值,参数是函数中接收参数的变量。但是,在通常用法中,这些术语是可以互换的,即参数是自变量。
您也可以创建带有可选参数的函数 - 只需插入参数名称,后跟等号(=),然后是默认值,如下所示。
<?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; } //打印返回值 echo getSum(5, 10); // 输出: 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; // 输出: 10 echo $divisor; // 输出: 2 echo $quotient; // 输出: 5 ?>测试看看‹/›
在PHP中,有两种方式可以将参数传递给函数:按值传递和通过引用传递。 默认情况下,函数参数按值传递,因此如果函数内的参数值发生更改,它不会受到函数外部的影响。 但是,要允许函数修改其参数,它们必须通过引用传递。
通过引用传递参数的方法是在函数定义中的参数名称前加上与号(&),如下例所示:
<?php /* 定义一个与数字相乘的函数 并返回新值 */ function selfMultiply(&$number){ $number *= $number; return $number; } $mynum = 5; echo $mynum; // 输出: 5 selfMultiply($mynum); echo $mynum; // 输出: 25 ?>测试看看‹/›
您可以在PHP脚本中的任何位置声明变量。 但是,声明的位置决定了变量在PHP程序中的可见性范围,即变量可以在哪里使用或访问。 这种可访问性称为变量作用域。
默认情况下,在函数内声明的变量是局部变量,不能从该函数外部访问或操作它们,如以下示例所示:
<?php //定义函数 function test(){ $greet = "Hello World!"; echo $greet; } test(); // 输出: Hello World! echo $greet; //产生未定义的变量错误 ?>测试看看‹/›
同样,如果尝试访问或导入函数内部的外部变量,则会得到未定义的变量错误,如以下示例所示:
<?php $greet = "Hello World!"; //定义函数 function test(){ echo $greet; } test(); //生成未定义变量错误 echo $greet; // 输出: Hello World! ?>测试看看‹/›
从上面的示例中可以看到,无法从外部访问在函数内部声明的变量,同样,不能在函数内部访问在函数外部声明的变量。这种分离减少了函数内变量受主程序中变量影响的机会。
提示:可以在不同的函数中为变量使用相同的名称,因为局部变量只能由声明它们的函数识别。
在某些情况下,您需要将主程序中的变量导入函数中,反之亦然。 在这种情况下,可以在函数内部的变量之前使用global关键字。 此关键字将变量转换为全局变量,使其在函数内部和外部均可见或可访问,如以下示例所示:
<?php $greet = "Hello World!"; //定义函数 function test(){ global $greet; echo $greet; } test(); // 输出: Hello World! echo $greet; // 输出: Hello World! //将新值赋给变量 $greet = "Goodbye"; test(); // 输出: Goodbye echo $greet; // 输出: Goodbye ?>测试看看‹/›
您将在PHP类和对象一章中了解有关可见性和访问控制的更多信息。
递归函数是一次又一次调用自身直到满足条件的函数。递归函数通常用于求解复杂的数学计算或处理深度嵌套的结构,例如,打印深度嵌套数组的所有元素。
以下示例演示了递归函数的工作方式。
<?php //定义递归函数 function printValues($arr) { global $count; global $items; //检查$arr是否为数组 if(!is_array($arr)){ die("ERROR: Input is not an array"); } /* 遍历数组,如果value本身是数组,则递归调用 函数将找到的值添加到输出项目数组中, 并为找到的每个值将计数器加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']); ?>测试看看‹/›
注意:创建递归函数时要小心,因为如果代码编写不正确,可能会导致函数调用的无限循环。