6.1 创建和调用函数
本节介绍创建自定义函数和调用函数的方法。使用自定义函数可以使程序的结构清晰,更利于分工协作和程序的调试与维护。
6.1.1 创建自定义函数
可以使用function关键字来创建PHP自定义函数,其基本语法结构如下:
function 函数名 (参数列表)
{
函数体
}
参数列表可以为空,即没有参数;也可以包含多个参数,参数之间使用逗号(,)分隔。函数体可以是一条PHP语句,也可以由一组PHP语句组成。
【例6-1】 创建一个非常简单的函数PrintWelcome,它的功能是打印字符串“欢迎使用PHP”,代码如下:
function PrintWelcome()
{
echo("欢迎使用PHP");
}
调用此函数,将在网页中显示“欢迎使用PHP”字符串。PrintWelcome()函数没有参数列表,也就是说,每次调用PrintWelcome()函数的结果都是一样的。
可以通过参数将要打印的字符串通知自定义函数,从而可以由调用者决定函数工作的情况。
【例6-2】 创建函数PrintString(),通过参数决定要打印的内容。
function PrintString($str)
{
echo("$str");
}
变量$str是函数的参数。在函数体中,参数可以像其他变量一样被使用。
可以在函数中定义多个参数,参数之间使用逗号分隔。
【例6-3】 定义一个函数sum(),用于计算并打印两个参数之和。函数sum()包含两个参数参数$num1和$num2,代码如下:
function sum($num1, $num2)
{
echo($num1 + $num2);
}
6.1.2 调用函数
可以直接使用函数名来调用函数,无论是系统函数还是自定义函数,调用函数的方法都是一致的。
【例6-4】 要调用PrintWelcome()函数,显示“欢迎使用PHP”字符串,代码如下:
<?PHP
function PrintWelcome()
{
echo("欢迎使用PHP");
}
PrintWelcome();
?>
如果函数存在参数,则在调用函数时,也需要使用参数。
【例6-5】 要调用PrintString()函数,打开用户指定的字符串,代码如下:
<?PHP
function PrintString($str)
{
echo("$str");
}
PrintString("传递参数");
?>
如果函数中定义了多个参数,则在调用函数时也需要使用多个参数,参数之间使用逗号分隔。
【例6-6】 调用sum()函数,计算并打印100和3之和,代码如下:
<?PHP
function sum($num1, $num2)
{
echo($num1 + $num2);
}
sum(100, 3);
?>
6.1.3 变量的作用域
在函数中也可以定义变量,在函数中定义的变量被称为局部变量。局部变量只在定义它的函数内部有效,在函数体之外,即使使用同名的变量,也会被看做是另一个变量。相应地,在函数体之外定义的变量是全局变量。全局变量在定义后的代码中都有效,包括它后面定义的函数体内。如果局部变量和全局变量同名,则在定义局部变量的函数中,只有局部变量是有效的。
【例6-7】 局部变量和全局变量作用域的例子。
<?PHP
$a = 100; // 全局变量
function setNumber() {
$a = 10;//局部变量
echo($a); // 打印局部变量$a
}
setNumber();
echo("<BR>");
echo($a); // 打印全局变量$a
?>
在函数 setNumber()外部定义的变量$a 是全局变量,它在整个 PHP 程序中都有效。在setNumber()函数中也定义了一个变量$a,它只在函数体内部有效。因此,在setNumber()函数中修改变量$a的值,只是修改了局部变量的值,并不影响全局变量$a的内容。运行结果如下:
10
100
为了更直观地认识局部变量和全局变量,分别在setNumber()函数内部和后面的echo($a)语句上设置断点,然后调试程序,并在断点处查看变量$a的值。局部变量$a的值如图6-1所示,全局变量$a的值如图6-2所示。
图6-1 局部变量$a的值
图6-2 全局变量$a的值
如果要在函数中使用全局变量,可以使用global关键字进行声明,方法如下:
定义全局变量
function 函数名(参数列表)
{
global 全局变量名
使用全局变量
}
【例6-8】 对例6-7进行修改,在setNumber()函数中设置全局变量$a的值,代码如下:
<?PHP
$a = 100; // 全局变量
function setNumber() {
global $a; //指定全局变量$a在函数setNumber()
$a = 10;//设置全部变量$a的值, 而不是局部变量
}
setNumber();
echo($a); // 打印全局变量$a
?>
因为全局变量$a在setNumber()函数中被设置为10,所以运行结果为10。
6.1.4 静态变量
在函数体内可以定义静态变量,静态变量的作用域与局部变量相同,只在定义它的函数体内。与局部变量不同的是,局部变量会在函数结束时被释放,而静态变量的值会被保留下来,下次调用函数时,静态变量的值不会丢失。
可以使用static关键字定义静态变量,语法如下:
static $变量名=初始值;
【例6-9】 静态变量的例子。
<?php
function test()
{
static $count = 1;
echo("第" . $count ."次调用函数<br />");
$count++ ;
}
for($i=1; $i<11; $i++) {
test();
}
?>
运行结果如下:
第1次调用函数
第2次调用函数
第3次调用函数
第4次调用函数
第5次调用函数
第6次调用函数
第7次调用函数
第8次调用函数
第9次调用函数
第10次调用函数
静态变量$count的值在调用函数后被保留。
6.1.5 变量函数
PHP支持变量函数,即通过变量调用函数。在变量名后面添加(),PHP会调用变量值指定的函数。
【例6-10】 变量函数的例子。
<?php
function foo()
{
echo "In foo()<br>\n";
}
function bar($arg = '')
{
echo "In bar(); argument was '$arg'.<br>\n";
}
// echo()函数的外壳函数
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // 调用foo()
$func = 'bar';
$func('test'); //调用bar()
$func = 'echoit';
$func('test'); //调用echoit()
?>
程序中使用$func()函数分别调用了foo()、bar()和echoit() 3个函数。
变量函数不能用于语言结构,如echo()、print()、unset()、isset()、empty()、include()、require()等。如果需要对它们调用变量函数,可以为其定义一个外壳函数,然后调用外壳函数。