函数是什么:
函数(function)是一段完成指定任务的已命名代码块。函数可以遵照给它的一组值或参数完成特定的任务,并且可能返回一个值。在PHP中有两种函数:自定义函数与系统函数。 函数的优越性: 控制程序设计的复杂性 提高软件的可靠性 提高软件的开发效率 提高软件的可维护性 提高程序的重用性
自定义函数语法格式:
function 函数名称([参数1 [,参数2 [,…]]])
{
程序内容叙述(也叫函数体);
[return 返回值;] //如需函数有返回值时使用
}
函数的使用: 函数名称([参数1 [,参数2 [,…]]]);
自定义函数的名称:
它是函数在程序代码中的识别名称,函数名可以是以字母或下划线开头后跟零个或多个字母、下划线和数字的任何字符串。
函数名不区分大小写。命名函数时不可使用已声明的函数,或PHP内建的函数名称。
参数:
所谓的参数就是用来把数值由函数外部传入函数体中,并用来加以运算处理。
参数之间用“ ,”号隔开。当函数不需要任何数值传入时,可以省略参数。
返回值:
当调用函数时需要它返回一些数值,那么就要函数体中用return语句实现。
格式如下:
return 返回值; //返回值也可以是一个表达式
实例:
<?php
echo "用函数求累加:<br>";
function test($a)
{
$sum=0;
for($i=0;$i<=$a;$i++)
$sum+=$i;
return $sum;
}
echo "50的累加是:".test(50)."<br>";
echo "100的累加是:".test(100)."<br>";
?>
在PHP中,函数可以在被调用之前定义,也可以在被调用之后定义。
function_exists() - - 判断函数是否存在。
变量的范围
当主程序调用函数时,PHP 会暂时停止目前主要程序流程的运行,并传递必要的运算参数给目标函数使用,以执行函数的程序码片段。 在函数执行结束后,函数会回传执行结果所得的数值,并将执行流程转回原本主程序中断的地方,继续执行运作。
变量的能见度
所谓变量的能见度,意指变量在程序中的可作用范围。当一个变量执行赋值动作后,会随着声明局部的差异,而有不同的作用范围。大致上来说变量会依据声明的局部分为下列两种:局部变量和全局变量
局部变量(内部变量)
在函数之中声明的变量就是局部变量,并且该变量只有在函数范围之中才能加以使用。如果其它程序局部需要调用使用该变量值时,必须透过「return」指令,来将其传回至主程序区块以作后续处理。
<?php
$a=0;
function print_A(){
$a = 3; //定义局部变量
echo "在函数中显示局部变量 a 值: $a <p>";
return $a;
}
$b = print_A();
echo "在函数外显示局部变量 b 值: $b <br>";
echo $a;
?>
全局变量
在函数范围之外所声明的变量就是全局变量。由于函数可以视为单独的程序片段,所以局部变量会复盖全局变量的能见度,因此在函数中并无法直接调用使用全局变量。 函数中若要使用全局变量时,必须要利用global关键字定义目标变量,以告诉函数主体此变量为全局。
<?php
$A="Hello !!"; //定义全局变量
function print_A() { //定义函数 print_A()
global $A; //利用 global 关键字声明变量 A 为全局变量
echo $A;
}
print_A();
?>
也可以使用预定义的全局变量数组$GLOBALS.这是一个特殊变量在程序运行时自动创建。格式:echo $GLOBALS[“A”];
在函数中声明全局变量时,其名字要与全局变量一致 通过unset($var)可以手动删除变量,变量会在内存中被释放,也就不在全局作用域中了。 使用require与include包含不会影响作用域 通过参数列表传递给函数的变量,对于函数来说是局部变量,除非在传递时带有&引用符号
静态变量
PHP支持声明函数变量为静态的(static)。一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调用时被初始化。要声明函数变量为静态的用关键字static。通常,静态变量的第一次使用时赋予一个初始值。
<?php
function test() {
static $a = 0;
echo $a;
$a++;
}
?>
无论是使用系统函数还是自定义的函数,我们都要可通过如下函数的三要素来了解一个函数:
函数的功能描述
函数的参数
函数的返回值
常规参数的函数格式说明:
string example(string name,int age,double height)
所谓的常规参数的函数,就是实参和形参应该个数相等、类型一致。就像C或Java等强类型型语言。 上面函数有三个参数,调用时传递的参数个数和顺序必须一致。
例如:
string chr(int $ascii) //返回指定的字符
float ceil(float $value) //进一法取整
array array_combine(array $keys,array $values)//合并一个数组
string implode(string $glue,array $pieces)
伪类型参数的函数格式说明:
mixed funName(mixed $a, number $b, callback $c)
PHP是弱类型语言,不仅在声明变量时不需要指定类型,当然在声明函数时也不需要指定类型,所以在PHP中函数的每个参数,都可以为其传递任意类型的值。
三种伪类型: mixed、number 和 callback。
bool empty(mixed $var) //检查一个变量是否为空
bool usort(array &$array,callback $cmp_function) //使用用户自定义的比较函数对数组中的值进行排序
number abs(mixed $number) //绝对值
引用参数的函数格式说明:
void funName(array &args) 相对于按值传递模式,并不会将父程序中的指定数值或目标变量传递给函数,而是把该数值或变量的内存储存区块相对地址导入函数之中。因此当该数值在函数中有任何变动时,会连带对父程序造成影响。
注意:如果在函数的形参中使用“&“修饰的参数,在调用该函数时必须传入一个变量给这个参数,而是不能传递一个值。
<?php
//使用常规参数传值
function test($arg) {
$arg = 200; //在函数中改变参数$a的值为200
}
$var = 100; //在父程序中声明一个全局变量$var,初值为100
test($var); //调用test函数,并将变量$var的值100传给函数的参数$arg
echo $var; //输出100。$var的值没有变化
//使用“&”引用参数传值
function test( &$arg ) {
$arg = 200; //改变参数$a的值为200,$arg是引用参数,外部变量$var也被修改
}
$var = 100; //在父程序中声明一个全局变量$var,初值为100
test($var); //调用test函数,并将变量$var的引用传给函数的参数$arg
echo $var; //输出200。$var的值在函数中修改变量$arg时被修改
?>
默认参数(“[ ]”中的)的函数格式说明:
mixed funName(string name [,string value [,int num]])
在php中,支持函数的默认方式调用。如果在调用函数时没有指定参数的值,在函数中会使用参数的默认值。 注意:默认参数必须列在所有没有默认值参数的后面。
<?php
/**
自定义一个函数名称为person,用于打印一个人的属性
@param string $name 人的名子属性字符串,默认值为"张三"
@param int $age 人的年龄属性,默认值为20
@param string $sex 人的性别属性,默认值为"男"
*/
function person( $name="张三", $age=20, $sex="男" ){
echo "我的名字是:{$name}, 我的年龄为:{$age}, 性别: {$sex} <br>";
}
person(); //在调用函数时三个参数都没有传值,全部使用默认参数
person("李四"); //第一个默认参数被传入的值覆盖,后两个参数使用默认参数
person("王五", 22); //前两个默认参数被传入的值覆盖,最后一个使用默认参数
person("贾六", 18, "女"); //在调用函数时,三个默认参数都被传入的值覆盖
?>
可变个数参数的函数格式说明:
mixed funName(string arg1 [,string ...] )
通常用户定义函数时,设置的参数数量是有限的。如果希望函数可以接受任意数量的参数,需使用以下函数:
func_get_args() //返回一个数组,包含所有参数
func_num_args() //返回参数总数
func_get_arg() //接收一个数字参数,返回指定参数
<?php
/**
声明一个函数more_args(),用于打印参数列表的值
虽然没有声明参数列表,但可以传入任意个数,任意类型的参数值
*/
function more_args() {
$args = func_get_args(); //将所有传递给脚本函数的参数当做一个数组返回
for($i=0; $i<count($args); $i++) { //使用for循环遍历数组$args
echo "第".$i."个参数是".$args[$i]."<br>"; //分别输出传入函数的每个参数
}
}
more_args("one", "two", "three", 1, 2, 3); //调用函数并输入多个参数
function more_args() {
for($i=0; $i<func_num_args(); $i++) { //使用for循环遍历数组$args
echo "第".$i."个参数是".func_get_arg($i)."<br>";//分别输出传入函数的每个参数
}
}
more_args("one", "two", "three", 1, 2, 3); //调用函数并输入多个参数
?>
回调函数格式说明:
mixed funName(callback arg)
所谓回调函数,就是指调用函数时并不是传递一个标准的变量作为参数,而是将另一函数作为参数传递到调用的函数中。 1.变量函数 2.使用变量函数声明和应用的回调函数 3.借助call_user_func_array()函数自定义回调函数 4.类静态函数和对象的方法回调
<?php
/** 声明第一个函数one, 计算两个数的和
@param int $a 计算和的第一个运算元
@param int $b 计算和的第二个运算元
@return int 返回计算后的结果
*/
function one( $a, $b ) {
return $a + $b;
}
/** 声明第二个函数two, 计算两个数的平方和
*/
function two($a, $b) {
return $a*$b + $b*$b;
}
$result = "one"; //将函数名"one"赋给变量$result, 执行$result()时则调用函数one()
//$result = "two"; //将函数名"two"赋给变量$result, 执行$result()时则调用函数two()
echo "运算结果是:".$result(2, 3); //变量$result的函数名值,就调用哪个函数
?>
使用变量函数声明和应用的回调函数
<?php
// 声明回调函数filter, 在0-100的整数中通过自定义条件过滤不要的数字
function filter( $fun ) {
for($i=0; $i <= 100; $i++) {
//将参数变量$fun加上一个圆插号$fun(), 则为调用和变量$fun值同名的函数
if( $fun($i) )
continue;
echo $i.'<br>';
}
}
//声明一个函数one, 如果参数是3的倍数就返回true, 否则返回false
function one($num) {
return $num%3 == 0;
}
// 声明一个函数two, 如果参数是一个回文数(翻转后还等于自己的数)返回true, 否则返回false
function two($num) {
return $num == strrev($num);
}
filter("one"); //打印出100以内非3的倍数,参数"one"是函数one()的名称字符串,是一个回调
echo '--------------------<br>';
filter('two'); //打印出100以内非回文数,参数"two"是函数two()的名称字符串,是一个回调
?>