本章我们讨论PHP 函数,函数是程序中的一段代码,该功能执行特定任务,使用函数的优点是:
- 减少代码重复
- 将复杂的问题分解成更简单的部分
- 提高代码的清晰度
- 重用代码
- 信息隐藏
有两种基本类型的功能。 内置功能和用户定义的功能。 内置函数是 PHP 语言的一部分。 示例是:phpinfo()
,round()
或abs()
。 用户定义的功能由应用程序员创建,以满足其需求。 它们是使用function
关键字创建的。
PHP 定义函数
使用function
关键字创建一个功能。
simple.php
<?php
function displayVersion() {
echo "this is PHP " . phpversion();
echo "\n";
}
displayVersion();
function 关键字后跟带有圆括号的函数名称。 函数的主体位于大括号之间。 我们说我们将称为函数。 如果我们调用一个函数,则会执行函数体内的语句。
displayVersion();
该行代码调用该函数。
$ php simple.php
this is PHP 5.5.9-1ubuntu4.14
在这里,我们看到了脚本的结果。
PHP return
关键字
return
关键字用于从函数返回值。 函数可能会也可能不会返回值。
returning.php
<?php
function maximum(x,y) {
if (x>y) {
return x;
} else {
returny;
}
}
a = 23;b = 32;
val = maximum(a, b);
echo "The max ofa and b isval \n";
我们有一个maximum()
功能。 它返回两个数字的最大值。 我们无法将其命名为 max,因为已经有内置的max()
函数。 创建此示例是出于学习目的; 我们始终希望在现实世界的程序中使用内置功能。
if (x>y) {
return x;
} else {
returny;
}
如果$x
变量大于$y
,则返回$x
。 否则,我们返回$y
。
$val = maximum($a, $b);
maximum()
函数返回的值分配给$val
变量。
echo "The max of a andb is $val \n";
我们将两个数字的最大值打印到控制台。
PHP 函数参数
大多数函数接受参数。 参数是发送到函数的值。 函数处理值,并可能返回一些结果。
fahrenheit.php
<?php
function FTC(c) {
returnc * 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) {
returna * a;
}value = 1;
for (i = 0;i < b;i++) {
value *=a;
}
return value;
}v1 = power(5);
v2 = power(5, 4);
echo "5^2 isv1 \n";
echo "5^4 is $v2 \n";
在这里,我们创建了幂函数。 该函数有一个带有隐式值的参数。 我们可以使用一个或两个参数来调用该函数。
$ php implicit_value.php
5^2 is 25
5^4 is 625
PHP 可变参数数量
一个函数可以接受可变数量的参数。 换句话说,有时我们不知道将有多少参数传递给该函数。 func_get_args()
函数返回一个包含函数的参数列表的数组。
从 PHP 5.6 开始,...
运算符可用于创建可变函数。
variable_arguments1.php
<?php
function sum(...nums) {sum = 0;
foreach (nums asn) {
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 asn) {
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 静态变量
静态变量是已静态分配的变量,其生存期遍及整个程序运行。 默认的局部变量不会在函数的连续调用中保留其值。
non_static.php
<?php
function nonstatic() {
value = 0;value += 1;
return $value;
}
nonstatic();
nonstatic();
nonstatic();
nonstatic();
echo nonstatic(), "\n";
在上面的示例中,我们有一个普通的非静态变量。 每次调用函数时,我们都会增加变量。 我们调用该函数 5 次。 但是,对于函数的每次调用都会启动非静态变量。 在 5 个函数调用之后,$value
等于 2。
首次调用函数时,静态变量仅启动一次。 之后,他们保留自己的价值。
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
2
$ php static.php
6
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
这是示例的输出。
通过值和引用传递参数
PHP 支持两种将参数传递给函数的方式。 默认方式是按值传递参数。 当我们按值传递参数时,该函数仅适用于值的副本。 当我们处理大量数据时,这可能会导致性能开销。
当我们通过引用传递值时,该函数会收到对实际值的引用。 修改后,原始值会受到影响。 这种传递值的方式更加节省时间和空间。 另一方面,它更容易出错。
我们应该使用哪种方式传递参数? 这取决于实际情况。 假设我们有一组数据,即员工工资。 如果我们要计算数据的某些统计信息,则无需修改它们。 我们通过价值观。 如果我们处理大量数据,并且计算速度至关重要,则可以参考。 如果我们要修改数据,例如 进行一些减薪或加薪,我们可以参考一下。
以下两个示例涵盖了这两个概念。
swap1.php
<?php
function swap(a,b) {
temp =a;
a =b;
b =temp;
echo "inside swap function:\n";
echo "\a isa \n";
echo "\b isb \n";
}
a = 4;b = 7;
echo "outside swap function:\n";
echo "\a isa \n";
echo "\b isb \n";
swap(a,b);
echo "outside swap function:\n";
echo "\a isa \n";
echo "\b isb \n";
交换函数在$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 isa \n";
echo "\b isb \n";
}
a = 4;b = 7;
echo "Outside the swap function:\n";
echo "\a isa \n";
echo "\b isb \n";
swap(a,b);
echo "Outside the swap function:\n";
echo "\a isa \n";
echo "\b isb \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
simple()
函数中的$value
变量为 NULL。
scope2.php
<?php
value = 4;
function simple() {value = 3;
echo value, "\n";
}
simple();
echovalue, "\n";
在此示例中,我们有两个具有相同名称的变量。 它们不会冲突,因为它们存在于不同的范围内。
$ php scope2.php
3
4
该值在函数内部为 3,在函数外部为 4。
在下一个示例中,我们将在函数内部修改一个值。
scope3.php
<?php
value = 1;
function simple() {
globalvalue;
value = 2;
}
echovalue, "\n";
simple();
echo $value, "\n";
我们使用global
关键字来引用在函数主体外部定义的变量。
$ php scope3.php
1
2
$value
已在simple()
功能内成功修改。