第7章 自定义函数
7.1 重复使用代码 7.1.1 为什么要重新使用代码 代价。在一个软件的使用过程中,相当多的时间是用在维护、个性测试和文档记录上,而不是最初的编码上。如果编写商业代码,就应该尽量限制结构中所用到的代码行数。 可靠性。使用现在的成熟的代码通常比新加入的代码更可靠。 一致性。如果重复使用运行在系统其他部分的代码,所实现的功能会达到一致。
7.1.2 使用require()和include() (3)PHP标记和require() (4)使用include() 7.1.3 制作Web站点的模版
7.2 在PHP中使用函数 7.3 自定义函数 7.2.1 调用函数 7.2.2 字母大小写和函数名
7.3.2 函数结构 (1)声明从关键字function开始 (2)函数名和必要的参数 (3)要执行的代码 (4)作用域 (5)参数的引用调用和值调用 (6)从函数中返回 (7)从函数返回值 (8)递归
函数声明: 函数声明从关键字function开始的,接下来给出函数名和必要的参数,然后给出每次调用这个函数时要执行的代码。例如: function my_function() { echo “调用自己定义的函数。”; }
函数名和必要的参数: 在给函数命名的时候,最重要的就是函数的名字要短小但又要有描述性。命名有几个限制: (1)函数的名字不能和已存在的函数重名。 (2)函数的名字只能包含字母、数字和下划线。 (3)函数名字不能用数字开始。 参数允许将数据传给函数,用户定义函数可以有多个参数和可选参数。如果参数已经定义了默认值,那么它就是可选的参数。
作用域: 在函数内部声明的变量作用域是从声明它们的那条命令开始到函数末尾。这叫做函数作用域。这些变量称为局部变量。 在函数外部声明的变量的作用域是从声明它们的那条命令开始到文件末尾,而不是函数内部。这叫做全局作用域。这些变量称为全局变量。 使用require()和include()不影响作用域 关键字global可以手工指定一个在函数中定义或使用的变量具有全局作用域。 程序举例
<?php $a = 1; $b = 2; Function Sum () { global $a, $b; $b = $a + $b; } Sum (); echo $b; ?> <?php Function Test () { $a = 10; echo $a; $a++; } Test( ); echo "<br>"; ?> <?php $a = 1; $b = 2; Function Sum () { $a=3; $b=5; $b = $a + $b; echo $b; } Sum (); echo "<br>"; ?> 程序1 程序2 程序3
参数的引用调用和值调用: function increment($value, $amount=1) { $value=$value+$amount; } 下面测试代码的输出结果将还是“10”。 $a=10; increment($a); echo $a; 原因: 这要归因于作用域规则,克服这个问题的一个办法是将函数内的$value声明为全局变量,这意味着为了用这个函数,要进行增量运算的变量需要被命名为$value。
更好的办法是用引用调用。在参数被传递给函数的时候,不是创建一个新的变量,而是收到一个原来变量的引用。任何对引用的修改都会影响原来的变量。通过在函数定义的参数名前加一个地址符(&)来指定参数的引用调用。在函数调用处不用修改。 function increment(&$value, $amount=1) { $value=$value+$amount; } $a=10; increment($a); echo $a; // 变量$a的值是11
从函数中返回: 关键字return终止函数的执行。一个函数结束是因为要么所有的命令都执行完了,要么就是用了关键字return。函数结束后,程序返回到调用函数的下一条命令。 function test_return() { echo “这条语句会被执行”; return; echo “这条语句永远都不会被执行”; }
通常,只是想根据条件响应从函数的中间返回。一个错误的条件通常是使用return命令在到达函数末尾前就终止执行的原因。例如,在两个数中间比较大小,其中的一个数丢失了可能就想退出。 function larger($x,$y) {if(!isset($x)||!isset($y)) {echo “这个函数需要两个参数”; return;} if($x>=$y) echo $x; else echo $y;}
从函数返回值: 想从函数中退出不是使用return的惟一理由。许多函数用return命令同调用它们的代码交流信息。 function larger($x,$y) {if(!isset($x)||!isset($y)) return false; if($x>=$y) return $x; else return $y;} 这里返回了传入的两个参数中较大的那个。在出错的情况下,返回一个逻辑值false。
递归: PHP支持递归函数,递归函数就是自己调用自己。 function reverse_r($str) { if(strlen($str)>0) reverse_r(substr($str,1)); echo substr($str,0,1); return; } function reverse_i($str) { for($i=1;$i<=strlen($str);$i++) { echo substr($str,-$i,1); } return; }
总结与思考 1、为什么要重复使用代码和编写函数。 2、函数如何定义。 3、函数的作用域和返回值。