5. PHP函式的应用
函式,是一个独立的程式码区段,只需撰写一次,就可以让程式的其他部分,藉由呼叫函式的方式,重复使用。通常,函式会接受参数,执行特定的功能,传回程式执行的结果。藉由使用函式,可以节省你的程式开发时间,以及减少程式的臭虫,提高程式的可维护性。
但是,光是把程式码,写成函式,并不会让你的程式变得更好,或是让你的工作变得更轻鬆。你必须学习养成如何撰写好的函式。好的函式,通常有以下的特质:
最好不超过一页:太长的函式,通常不好维护,而且容易发生错误。
函式只执行一个特定的功能:如果,在一个函式裡面,执行多个功能时,通常必须把各功能,再切割成独立的函式。这样,才可以更模组化,在主程式组合这些功能时,能更有弹性。
好的函式,会有好名字:如果,你无法替你的函式,找出一个好名字的话,通常代表,你对函式的功能,没有具体的认知。自然无法写出好的函式。
我们使用范例,来学习如何撰写函式:
1) 函式的语法。
2) 参数传递。
3) 预设参数。
4) 函式内变数的范围。
5) 使用 include()函式,来建立自己的函式库。
5.1 函式的语法
撰写函式时,在 function保留字之后,接著是使用者自己命名的函式名称。函式名称之后,是由括弧所包含的是要交给函式处理的参数。视情况需要,函式可以接受任何数目的参数,包括不接受任何参数。之后,是由 { 和 }所包含的程式区段。
函式的执行:在主程式呼叫函式之后,自 { 开始由上而下的顺序,一直执行到 }為止或碰到 return 的命令句时结束。
return 可以用来结束函式的执行,return 后面如果有接任何运算式,则会将运算式所得的结果,传回给主程式。
实例:
- function 函式名称([参数1,参数2, ...参数n]){
- 程式码
- }
复制代码
实例: (无参数, 无回转值)
- <?php
- function today(){
- $ty = date("Y") - 1911;
- echo '民国 '.$ty.'年'.date("m月d日");
- }
- today();
- ?>
复制代码
实例: (无参数, 有回转值)
- <?php
- function today(){
- $ty = date("Y") - 1911;
- return'民国 '.$ty.'年'.date("m月d日");
- }
- echo today();
- ?>
复制代码
实例: (有参数, 有回转值)
- <?php
- function numberOptions($start, $end, $selected){
- $option = "";
- for($i = $start; $i <= $end; $i++){
- $list .= "<option value='$i'";
- if($i==$selected){
- $list .= " SELECTED";
- }
- $list .=">$i</option>";
- }
- return $list;
- }
- $yr = date('Y') - 1911;
- $yr_start = $yr - 5;
- $yr_end = $yr + 5;
- $mn = date('m');
- $dy = date('d');
- $yr_option = numberOptions($yr_start, $yr_end, $yr);
- $mn_option = numberOptions(1, 12, $mn);
- $dy_option = numberOptions(1, 31, $dy);
- ?>
- 民国 <select name=year><?php echo $yr_option; ?></select>年
- <select name=month><?php echo $mn_option; ?></select>月
- <select name=day><?php echo $dy_option; ?></select>日
复制代码
5.2 参数传递
当其他部分的程式码,呼叫函式,以变数当作参数,传递给函式时,实际上函式所接受到的是这个变数的值,所以,在函式中的程式码,如果更改这个变数时,并不会影响到原本程式中的变数。这种参数的传递方式,称之為值的传递。
另一种参数传递的方式,称之為参照的传递。使用这种方式传递参数给函式处理时,当函式更改参数的值,原本程式的变数值也会跟著改变。使用参照传递方式,在函式的定义中,参数之前必须加上 &符号。其他程式,呼叫这个函式时,必须在这个参数使用变数,不可以是其他的运算式(如:常数、定数)。
实例:
- <?php
- function add_by_value($value, $increment){
- $value += $increment;
- }
- function add_by_reference(&$value, $increment){
- $value += $increment;
- }
- $n = 100;
- $i = 50;
- echo '原本 n 的值: '.$n.'<br />';
- add_by_value($n, $i);
- echo '值传递之后 n 的值: '.$n.'<br />';
- add_by_reference($n, $i);
- echo '参照传递之后 n 的值: '.$n.'<br />';
- ?>
复制代码
5.3 预设参数
函式使用预设参数时,呼叫函式的程式,可以不需要提供这个参数,而使用函式中所定义的参数预设值。
使用预设参数时,预设参数必须放在非预设参数的后面(右边)。
实例:
- <?php
- function numberOptions($start, $end, $selected=3){
- $option = "";
- for($i = $start; $i <= $end; $i++){
- $list .= "<option value='$i'";
- if($i==$selected){
- $list .= " SELECTED";
- }
- $list .=">$i</option>";
- }
- return $list;
- }
- $number_options = numberOptions(1, 10);
- ?>
- <select name=number><?php echo $number_options; ?></select>
复制代码
5.4 函式内变数的范围
函式内所使用的变数,除非特别指定,均為区域变数。区域变数的范围,只限定在定义这个变数的函式内。函式外即使有同名的变数,因為范围不同,所以是另一个变数。两者不会互相影响。
如果,在函式之内有特别指定变数范围(在变数名称之前,加上 global 保留字)。变数变成全域变数。
实例:
- <?php
- function local_scope(){
- $x = 5;
- }
- function global_scope(){
- global $x;
- $x = 10;
- }
- $x = 0;
- echo '原本 x 的值: '.$x.'<br />';
- local_scope();
- echo '呼叫 local_scope()函式之後, x 的值: '.$x.'<br />';
- global_scope();
- echo '呼叫 global_scope()函式之後, x 的值: '.$x.'<br />';
- ?>
复制代码
5.5 使用 include() 函式,來建立自己的函式库
到目前为止,所有的函式,都是写在和主程式同一个网页中,所以,只有这个主程式的网页可以呼叫这些函式。
更好的做法,是把所有函式按照功能的类别,写在同一个档案。然后,在主程式中,使用 include() 或 include_once() 函式,将函式的档案,含括在主程式中。透过含括档案的方式,就可以把函式的功能,提供给其他的PHP网页程式使用。
实例: (使用含括档案的方式)
- <?php
- // 档名: 110_07.php
- function numberOptions($start, $end, $selected){
- $option = "";
- for($i = $start; $i <= $end; $i++){
- $list .= "<option value='$i'";
- if($i==$selected){
- $list .= " SELECTED";
- }
- $list .=">$i</option>";
- }
- return $list;
- }
- ?>
- <?php
- // 档名: 110_08.php
- include("110_07.php");
- $yr = date('Y') - 1911;
- $yr_start = $yr - 5;
- $yr_end = $yr + 5;
- $mn = date('m');
- $dy = date('d');
- $yr_option = numberOptions($yr_start, $yr_end, $yr);
- $mn_option = numberOptions(1, 12, $mn);
- ?>
- 民国 <select name=year><?php echo $yr_option; ?></select>年
- <select name=month><?php echo $mn_option; ?></select>月
- <select name=day><?php echo $dy_option; ?></select>日
复制代码
[ 本帖最后由 mastermind007 于 2006-8-13 10:47 编辑 ] |