什么是函数  函数的参数  函数的返回值  PHP中系统函数的使用  使用自定义函数 PHP 中的函数 第 章 函数是 PHP 最重要的组成部分。如果说前几章介绍的变量、表达式、流程控制是 PHP 的基础的话,那么可以说函数就是 PHP 的主体。什么是函数呢?简单的说,函数 就是为了完成特定功能而作为一个整体存在的代码块。PHP 中有大量的库函数,同时 也允许用户自定义函数。本章就带领读者来认识一下函数。本章内容包括:什么是函数、 函数的参数、函数的返回值、PHP 内部函数的使用、PHP 加载外部函数、如何自定义 函数等。 PHP 网络编程从入门到精通 ·58· 6.1 什么是函数 简单的说,函数是为了完成特定功能,而作为一个整体存在的代码块。例如,求绝对值函数 abs() 完成的功能是求一个数的绝对值,而且它也是独立存在的,并不受其他变量或函数的影响。函数采用 以下方法来定义。 function f_name($arg) { expr; return $retval; } 以上代码中 f_name 为函数名,以名字来区别其他函数。$arg 为函数的参数,参数是在函数执行中 要传递的值,它跟在函数后面的括号里。如果要求“-3”的绝对值就要用参数来传递“-3”,如 abs(-3)。 expr 为函数执行的语句,$revel 为函数的返回值,返回值并不是每个函数都有。返回值指完成函数后返 回到主程序中的值。如 abs(-3)的返回值为“-3”的绝对值“3”。其中函数名的命名规则与 PHP 中的 变量命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。 在 PHP 3 中一个函数在调用之前必须已经被初始化。如果调用一个未被定义的函数,将会导致错 误。从 PHP 4 开始,就不再有这种限制,这意味着可以先调用一个并未被定义的函数,然后再去定义 函数。但是如果函数的定义是有条件的,那么在这有条件的定义发生前,是不能被调用的。就像下面 这两种情况。 1.有条件的定义 具体内容请参看以下代码: 以上为第 1 种情况,虽然定义函数的条件为真,但是在有条件的定义前,函数是不能被调用的。 即如果某条件为真则再去考虑是否去做某件事,如果这条件根本不存在,就不考虑去做这件事,更不 用说怎么去做了。 这里举一个形象的例子。例如,一个家长叫小孩子去买东西。小孩子如何去买东西可以看作是一 个函数。但是小孩也给家长提了条件,如果给 1 元辛苦费才去买。即只有满足了给 1 元钱的条件,才 去执行买东西这个函数,也才去考虑怎么去买。如果条件根本不存在,那么函数就相当于没有定义, 当然也不会执行了。 2.函数的嵌套定义 第 2 种情况是在某一函数体中定义另一个函数。只有当外层函数被调用时,内层函数才会被正确 定义。所以也只有在调用外层函数后,才能调用内层函数。示例如下: 这种情况也很容易理解,与第 1 种情况存在某些相似之处。只是把定义函数的条件转化为了某一 函数的执行。 如果不把上面比方的例子中的家长给钱看成一个条件,而是一个函数,就变成了第 2 种函数的嵌 套定义了。即家长给钱的函数执行了,那么孩子去买东西这个函数就会被定义,然后就可以调用函数, 如怎么去买东西了。 另外在使用函数时还有一点需要注意。与变量不同,函数是大小写不敏感的。如定义的函数为 bar(), 实际使用时完全可以通过 bar()来调用它。但通常情况下,为了避免混淆,调用时还是使用定义时的名字。 6.2 函数的参数 在 6.1 节介绍函数的定义中,提到了函数的参数: PHP 网络编程从入门到精通 ·60· function f_name($arg) { expr; return $retval; } 以上代码中的$arg 就是一个参数。那么究竟什么是函数的参数? PHP 中的函数按有无参数可分为:有参数函数和无参数函数两种。函数参数只存在于有参数的函 数之中。函数参数就是函数名称后圆括号内的常量值、变量、表达式或函数。当定义函数时,这时的 参数因为无实际值,所以称其为形式参数,形式参数不能是常量值。当调用该函数时,这时的参数有 实际的值称为实际参数。形式参数的类型说明在函数名后的“()”之内。 下面通过一个简单的例子来说明函数参数的使用。 函数参数的使用实例 ".$text.""; //打印字符并加入粗体斜体效果 } $string="PHP 编程是一件很简单的事情"; //定义变量 echo $string; //打印变量 echo "
"; B_I_text($string); //用实际参数调用函数 ?> 保存以上代码为“6-1.php”。在 PHP 执行环境中运行该代码,执行结果如图 6.1 所示。 上例中,先定义了有形式参数的函数。然后定义变量, 先显示变量,再通过实际参数调用函数。从这个例子中, 读者可以了解到函数的参数是如何传递值到函数体的。 在使用函数参数时还应该注意一个问题。函数的参数 是有类型限制的,即某一函数的参数可能只对应某一种类 型。如果参数的类型与函数要求的类型不一致,就会发生 错误,可能会返回用户不希望的结果。如 abs()函数的作用是计算一个数的绝对值,所以它的参数只能 为整型或者浮点型数。如果用字符或者数组作为函数的参数,则一定会出现用户不希望的结果。 另外,有的函数有默认的值的参数。这时的参数就变成了可选参数,即调用该函数时可以不加有 默认值的参数。函数将用默认值来替换该参数。下面举一个例子来说明: 函数有默认值参数的使用实例 图 6.1 函数参数的使用实例执行结果 第 6 章 PHP中的函数 ·61· "; //使用颜色参数 echo "".$text.""; //打印字符并加入粗体斜体效果 echo ""; } $string="PHP 编程是一件很简单的事情"; //定义变量 echo $string; //打印变量 echo "
"; B_I_text($string); //调用函数,无$color 参数 Echo "

"; B_i_text($string,"red"); //调用函数,加入$color 参数 ?> 保存以上代码为“6-2.php”。在 PHP 执行环境中运行该文件,执行结果如图 6.2 所示。 上例先定义了一个有两个参数的函数,其中的$color 参数有默认值。即当调用函数时,如果不加可选参数$color, 将使用默认值“#000000”,即用黑色打印字体。所以第 1 次调用该函数时没有使用$color 函数,打印出的字体是黑 色的。第 2 次调用时使用了“red”作为$color 参数,则打 印出的字体就是红色的。 6.3 函数的返回值 在 6.1 节讲到函数时,同时也提到了函数的返回值。 function f_name($arg) { expr; return $retval; } 即以上代码中的$retval。函数通过 return 来返回值。函数的返回值可以是数值、字符等变量。下面 通过一个实例来说明函数的返回值是如何使用的。 图 6.2 函数有默认值参数的使用实例执行结果 PHP 网络编程从入门到精通 ·62· 函数返回值的使用实例 保存以上代码为“6-3.php”。在 PHP 执行环境中运 行以上代码,执行结果如图 6.3 所示。 另外,函数不能有多个返回值,但是为了返回多个值, 可以将数组作为一个函数的返回值,从而实现多个值的返 回。下面通过一个实例来说明,函数是如何将一个数组作 为其返回值的。 函数将数组返回值的使用实例 $num2) //如果前面数大两者互换 { $temp=$num1; $num1=$num2; $num2=$temp; } for($i=$num1;$i<$num2;$i++) //循环比较两数之间的值 { if($i%2==0) //选出其中的偶数 { $t[$j]=$i; //把结果赋值给数组元素 $j++; } } return $t; //把数组$t 作为函数返回值 } $a=3; //定义变量 图 6.3 函数返回值使用实例执行结果 第 6 章 PHP中的函数 ·63· $b=20; $c=E_num($a,$b); //调用函数 echo $a."到".$b."之间的偶数为:"; for($i=0;$i"; } ?> 上面代码定义了一个函数 E_num(int num1,int num2),它的作用是求出两个数之间所有的偶数。因 为两数之间的偶数可能为多个数,所以要返回多个数 值。这就要在函数中把这些数值定义到数组中,然后 把数组当作函数的返回值返回。 把以上代码保存为“6-4.php”。在 PHP 执行环境 中运行以上代码,执行结果如图 6.4 所示。 函数的返回值部分,这一节就介绍到这里。相信 通过上面的几个例子,对函数的返回值的讲解,读者会有一个深刻的印象。 6.4 PHP 内部函数的使用 PHP 为用户提供了丰富的库函数即内部函数,能否熟练的使用 PHP 的内部函数,是衡量一个 PHP 程序员合格与否的标准。那么如何使用 PHP 中的库函数呢?由于内部函数是集成在 PHP 解释器中的, 所以它不用被定义,可以直接使用。使用时只是要注意函数的参数类型、调用方法、返回值及格式即可。 相对于用户自定义函数来说,PHP 的内部函数使用更简单。一是因为它不用定义;二是不用担心 函数体本身会出错。如果在使用库函数时返回了不希望出现的结果,那么不要怀疑是系统函数有问题。 因为这些函数都是经过了反复的实践证明的,是绝对正确无误的。 下面就通过两个例子,来说明在 PHP 中如何使用库函数。 调用常用的数学函数。 PHP 库函数的使用实例 1 "; echo floor(5.321); //调用取整函数 echo "

"; 图 6.4 函数将数组返回值的使用实例执行结果 PHP 网络编程从入门到精通 ·64· echo pi(); //调用圆周率函数 echo "

"; echo min(5,1,3,7,8); //调用求最小值函数 echo "

"; echo max(5,1,3,7,8); //调用求最大值函数 ?> 保存以上代码为“6-5.php”。在 PHP 执行环境中运 行以上代码,执行结果如图 6.5 所示。 调用数组函数。 PHP 库函数的使用实例 2 将以上代码保存为“6-6.php”。在 PHP 执行环境中 运行以上代码,执行结果如图 6.6 所示。 从上两个例子中可以看出,PHP 的库函数有的需要 参数,有的不需要参数,有的还需要多个参数。所以在 使用函数前,了解该函数的使用方法是很有必要的。本 书将在以后章节中专门讲解相关的函数使用方法。 6.5 PHP 加载外部函数 PHP 有很多库函数,还有一些函数需要和特定的 PHP 扩展模块一起编译,否则在使用它们的时候 就会得到一个致命的“未定义函数”错误。例如,要使用图像函数如 imagecreatetruecolor(),就需要在 编译 PHP 的时候加上对 GD 库的支持。具体作法就是修改 php.ini 文件。找到这一行: 图 6.5 PHP 库函数的使用实例 1 执行结果 图 6.6 PHP 库函数的使用实例 2 执行结果 第 6 章 PHP中的函数 ·65· ;extension=php_gd.dll 把这一行行首的“;”去掉,这样 PHP 解释器在启动时就会加载 GD 库函数,然后就可以像使用内 部库函数一样使用 GD 库函数。 对其他外部函数的使用也是如此,要使用相应的函数,就要先加载相应的模块。有很多核心函数 已包含在每个版本的 PHP 中,如字符串和变量函数等。调用 Phpinfo()函数,可以了解到 PHP 加载了哪 些扩展库。同时还应该注意,很多扩展库默认就是有效的。 下面通过一个实例,来说明如何加载并使用外部函数。因为要使用 GD 库函数,所以第 1 步修改 php.ini 文件,去掉“;extension=php_gd.dll”这一行行首的“;”。另外,在这个例子中要用到 wingdings.ttf 字体,所以要把 wingdings.ttf 这个字体文件复制到 PHP 文件的同一个目录下。该实例要实现的功能是 创建一个图像文件,并在图像上画出一些图形。具体代码如下: 保存以上代码为“6-7.php”。在 PHP 执行环境中运行以上代码,执行结果如图 6.7 所示。 图 6.7 GD 库函数使用实例执行结果 因为这一节只讲怎么使用外部函数,所以并不详细说明函数具体是怎么使用的。关于 GD 库函数 PHP 网络编程从入门到精通 ·66· 的使用,将会在第 10 章 PHP 中的图像处理中专门为读者介绍。 6.6 自定义函数 在实际进行 PHP 编程时,由于要面对的情况可能十分复杂,仅仅依靠 PHP 内置的库函数,有时往 往不能实现用户所要达到的目的。这时就要用户自己构造函数来解决实际问题。PHP 允许用户使用自 定义函数。那么,自定义函数应该怎么用呢?这一节就来解决如何使用自定义函数及函数的动态调用、 函数的递归等问题。 6.6.1 如何自定义函数 在 PHP 中,自定义函数是一件很简单的事情。只需使用以下语法格式就可以完成对函数的自定义: function functionname() { statement; return $retval; } 从以上代码中可见,要自定义函数,就是使用 function 语句,后面跟函数名加“()”。如果函数需 要参数,就要把参数加在括号内。函数体部分用“{}”来包括起来,以使之和其他语句分开。大括号 内是函数体,其中包括所要执行的内容、返回值等。 下面通过一个实例来说明,如何完成自定义函数的自定义。 函数的自定义实例 $num2) //如果前面数大两者互换 { $temp=$num1; $num1=$num2; $num2=$temp; } $s=$num2; //定义变量备用 $i=1; //定义变量备用 while($s%$num1!=0) //是否满足最小公倍数 { $s=$num2*$i; //大数翻倍 $i++; 第 6 章 PHP中的函数 ·67· } return $s; //返回结果 } echo my_f(1,3); //输出 1 与 3 的最小公倍数 echo "

"; echo my_f(6,8); //输出 6 与 8 的最小公倍数 echo "

"; echo my_f(13,29); //输出 13 与 29 的最小公倍数 echo "

"; echo my_f(5,100); //输出 5 与 100 的最小公倍数 echo "

"; echo my_f(35,3); //输出 35 与 3 的最小公倍数 echo "

"; ?> 上例中,定义了一个函数,作用是通过大数翻倍法来求 两个数的最小公倍数。保存以上代码为“6-8.php”。在 PHP 执行环境中运行以上代码,执行结果如图 6.8 所示。 通过上例,读者能够理解到 PHP 中是如何自定义函数的。 只要掌握了方法,自定义函数其实是一件很简单的事情。 6.6.2 使用自定义函数 自定义函数在完成定义后,就可以使用了。使用的方法也相当简单,就像使用 PHP 库函数一样。 代码如下: function functionname(); 函数名后面加上括号,里面带上适当的参数就行了。下面继续通过一个实例来说明,在 PHP 中是 如何使用自定义函数的。 自定义函数的使用实例 "; echo (-$num2+sqrt($num2*$num2-4*$num1*$num3))/(2*$num1); 图 6.8 函数的自定义实例执行结果 PHP 网络编程从入门到精通 ·68· } else //两个实根 { echo "方程有两个实根:

"; echo (-$num2+sqrt($num2*$num2-4*$num1*$num3))/(2*$num1); echo ","; echo (-$num2-sqrt($num2*$num2-4*$num1*$num3))/(2*$num1); } } echo "方程:2x2+3x+1=0 的根为:

"; my_f(2,3,1); //调用函数 echo "

"; echo "方程:x2+9x+1=0 的根为:

"; my_f(1,-6,9); //调用函数 echo "

"; echo "方程:3x2+2x+1=0 的根为:

"; my_f(3,2,1); //调用函数 ?> 以上代码定义了一个函数,该函数的作用是使用公式 法求一元二次方程的根。定义完成后,根据 3 种不同情况 调用函数。把以上代码保存为“6-9.php”。在 PHP 执行 环境中运行以上代码,执行结果如图 6.9 所示。 这一节,自定义函数的使用就介绍到这里。通过 6-8.php 和 6-9.php 两个例子,对于如何定义一个函数,如 何使用自定义函数,读者应该有一个清晰的认识了。 6.6.3 函数的动态调用 由于 PHP 支持可变化的函数概念。所以如果在一个变量的名称后面加上一对圆括号“()”,那么 PHP 将去寻找与这个变量名字相同的函数。无论这个变量的数值是什么,函数都会被执行。这个过程 就实现了函数的动态调用。 为了形象说明函数的动态调用这个问题,下面通过实例来介绍。 函数的动态调用实例 "; //以 12 号字体输出文字 echo $text; 图 6.9 自定义函数的使用实例执行结果 第 6 章 PHP中的函数 ·69· echo ""; } function my_f_2($text) //定义函数 2 { echo ""; //以 20 号字体输出文字 echo ""; //给文字加上下划线效果 echo $text; echo ""; echo ""; } $test="my_f_1"; $test("I LIKE PHP!"); //动态调用 my_f_1() echo "

"; $test="my_f_2"; $test("用 PHP 编程,其实很简单!"); //动态调用 my_f_2() ?> 把以上代码保存为“6-10.php”。在 PHP 执行环境中 运行以上代码,将出现如图 6.10 所示的执行结果。 以上代码先定义了两个函数,然后把函数名称赋值为 变量。变量名后加上括号,PHP 就会去寻找同名的函数 my_f_1,找到后则运行,从而实现了函数的动态调用。调 用 my_f_2 的过程与之类似。 通过上面的实例,相信读者对 PHP 中如何动态调用函 数已经有了一定程度的了解。 6.6.4 函数的递归 这一小节来介绍 PHP 函数的递归。那么什么是递归呢?其实递归就像读者都听过的一个歌谣那样: 从前有座山,山里有座庙,庙里有个老和尚和一个小和尚。老和尚给小和尚讲故事,故事里说从前有 座山,山里有座庙……就像这样无限循环。回过头来继续说递归,递归简单的说就是函数自身调用自身。 有时通过函数的递归来处理问题是十分有效的。如求斐波纳契数列第 N 项的值,如果采用传统方 法效率很低。但如果使用函数的递归,解决起来就会容易的多。下面就通过例子来说明函数的递归问题。 在列出具体代码前,先来了解一下斐波纳契数列的特点。斐波纳契数列即“兔子生兔子的问题”: 有一个人把一对兔子放在四面封闭的地方。假定每个月一对兔子生下另外一对。而这新的一对在二个 月后就生下另外一对。这样一年后他会有多少对兔子?这里对这个数列作一改动,设第一项与第二项 为 1。结果就是像这样的一组数列:1,1,2,3,5,8,13,21,34,55,89,144……即某一项为它 前面两项之和。在了解了数列的特点后,下面就通过实际使用函数的递归,来解决这一问题。 函数的递归实例 图 6.10 函数的动态调用实例执行结果 PHP 网络编程从入门到精通 ·70· "; echo "斐波纳契数列的第 12 项为:"; echo Fibanacci(12); echo "

"; echo "斐波纳契数列的第 7 项为:"; echo Fibanacci(7); echo "

"; echo "斐波纳契数列的第 20 项为:"; echo Fibanacci(20); ?> 保存以上代码为“6-11.php”。在 PHP 执行环境中运行 以上代码,执行结果如图 6.11 所示。 以上代码中当参数为 1 或 2 的情况很容易理解,直接返 回 1 即可。除此以外的情况直接返回了和数组定义完全相同 的公式:某一项为其前两项之和,从而实现了函数的递归。 可以看出使用函数的递归解决此类问题相对于用迭代 法来说是简单的、有效的。 另外,在使用函数递归时要注意以下两个问题: 在递归中要有使递归中止的代码,不能使递归陷入无限循环之中。 同时要避免递归函数调用超过 100~200 层的范围,因为可能会破坏堆栈从而使当前脚本终止。 6.7 本 章 小 结 这一章介绍了 PHP 中函数的使用方法。其中讲了什么是函数、函数的参数和返回值、PHP 库函数 的使用、外部函数的加载及自定义函数。正如本章开始时提到的,函数是 PHP 的最重要的组成部分, 只有熟练的使用函数,才算是真正学会了 PHP。通过本章的学习使读者对 PHP 中函数的使用有了一定了 解。关于具体的函数如何使用,从第 7 章开始将用 9 章的篇幅专门为读者讲解 PHP 中各种库函数的使用。 图 6.11 函数的递归实例执行结果

还剩13页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

zhaovnan

贡献于2010-11-08

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf