在本文中,我们介绍了PHP函数。
$ php -v php -v PHP 8.1.2 (cli) (built: Aug 8 2022 07:28:23) (NTS) ...
我们使用PHP版本8.1.2。
函数是用于执行特定操作的可重用代码块。该函数执行特定任务。使用函数的优点是:
- 减少代码重复
- 将复杂问题分解成更简单的部分
- 提高代码的清晰度
- 代码重用
- 信息隐藏
函数有两种基本类型。内置函数和用户定义的函数。内置函数是PHP语言的一部分。示例是:phpinfo、round或abs。用户定义的函数由应用程序员创建以满足他们的需要。它们是使用function关键字创建的。
PHP定义函数
函数是用function关键字创建的。
<?php
function displayVersion() {
echo "This is PHP " . phpversion();
echo "\n";
}
displayVersion();
函数关键字后跟带圆括号的函数名称。函数体位于大括号之间。我们说我们调用一个函数。如果我们调用一个函数,函数体内的语句就会被执行。
displayVersion();
这行代码调用函数。
$ php simple.php This is PHP 8.1.2
PHP返回关键字
return关键字用于从函数返回一个值。函数可能返回也可能不返回值。
<?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";
我们有一个最大值函数。它返回两个数字的最大值。我们不能将其命名为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函数参数
大多数函数都接受参数。参数是发送给函数的值。这些函数处理值并可能返回一些结果。
<?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函数中的参数可能具有隐式值。如果未提供值,则使用隐式值。
<?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";
这里我们创建了一个幂函数。该函数有一个带有隐式值的参数。我们可以用一个或两个参数调用函数。
$ php implicit_value.php 5^2 is 25 5^4 is 625
PHP参数个数可变
一个函数可以接受可变数量的参数。换句话说,有时我们不知道有多少参数会传递给函数。func_get_args函数返回一个包含函数参数列表的数组。
可用于创建可变参数函数的...运算符。
<?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
<?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函数命名参数
当我们使用命名参数时,参数的顺序无关紧要。
<?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静态变量
静态变量是静态分配的变量,其生命周期贯穿程序的整个运行。默认局部变量不会在函数的连续调用中保留它们的值。
<?php
function nonstatic() {
$value = 0;
$value += 1;
return $value;
}
nonstatic();
nonstatic();
nonstatic();
nonstatic();
echo nonstatic(), "\n";
在上面的例子中,我们有一个普通的非静态变量。每次调用该函数时,我们都会递增该变量。我们调用了该函数5次。但是,每次调用该函数都会启动非静态变量。After5函数调用$value等于1。
静态变量仅在首次调用函数时启动一次。他们之后保留其价值。
<?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匿名函数
匿名函数没有名字。
<?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
匿名函数通常与数组函数一起使用。
<?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关键字和粗箭头运算符(=>)创建的。
$f1 = fn($x) => $x * $x; $f2 = fn($x) => $x * $x * $x; echo $f1(2) . "\n"; echo $f2(3) . "\n";
在示例中,我们定义了两个箭头函数。
$ PHP arrow.php 4 27
<?php
$vals = [2, -1, 0, -4, -2, 5, 4];
$res = array_filter($vals, fn ($e) => $e > 0);
echo implode(',', $res) . "\n";
加上箭头函数,代码更简洁。
按值和按引用传递参数
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函数中被改变。
<?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函数递归
递归,在数学和计算机科学中,是一种定义函数的方法,其中定义的函数在其自己的定义中应用。换句话说,递归函数调用自身来完成它的工作。递归是迭代的替代方法。递归是函数式语言的主要方法。
一个典型的例子是阶乘的计算。
<?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中变量的作用域。范围是可以引用变量的范围。当我们使用函数时,有两个基本作用域:全局作用域和局部作用域。本地作用域也称为函数作用域。
<?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。
<?php
$value = 4;
function simple() {
$value = 3;
echo $value, "\n";
}
simple();
echo $value, "\n";
在这个例子中,我们有两个同名的变量。它们不会冲突,因为它们存在于不同的范围内。
$ php scope2.php 3 4
函数内值为3,函数外值为4。
在下一个示例中,我们修改函数内部的值。
<?php
$value = 1;
function simple() {
global $value;
$value = 2;
}
echo $value, "\n";
simple();
echo $value, "\n";
我们使用global关键字来引用定义在函数体之外的变量。
$ php scope3.php 1 2
在simple函数中成功修改了$value。
在本文中,我们介绍了PHP函数。
列出所有PHP教程。
