文章教程

6.5函数

9/17/2020 9:49:37 PM 人评论 次浏览

6.5 函数

PHP的真正力量来自它的函数:它拥有超过1000个内建的函数。除了内建的PHP函数,用户还可以创建自己的函数。本节将介绍函数的相关概念。

6.5.1 认识函数

函数是将一段具有某种功能的语句写成独立的程序单元,然后给予特定的名称,有些程序语言将函数称为方法、子程序或者过程。函数具有以下优点。

(1)函数具有可重用性,一个函数被写好后,可以在程序中不同地方调用这个函数,而不必重新编写。

(2)函数的使用使程序更精简,从而提高程序的可读性。

函数也具有缺点:函数的使用会使程序的运行速度减慢,因为多了一道调用函数的手续。

6.5.2 自定义函数

在程序设计中,可以将一段经常使用的代码封装起来,在需要使用时直接调用,这就是函数。PHP中不仅提供了大量丰富的系统函数,还允许用户自定义函数。

1.函数定义

函数定义的语法如下。

  function fun_name([$arg1 , $arg2 ,…, $argn]) {
  	fun_body; 			//函数体,实现具体功能的代码
  	[return $value;]		//返回值
  }

其中:

(1)function是定义函数的关键字。

(2)fun_name是自定义函数的名字,必须是以字母或下划线开头,后面可以跟字母、数字或下划线。函数名代表整个函数,具有唯一性,因为PHP不支持函数重载,所以函数名不能重复,并且PHP中函数名是不区分大小写的。

(3)$arg1 , … , $argn是函数的参数,可以有一个或多个,也可以没有。其作用范围为函数体内局部变量。

(4)return $value是函数的返回值语句,根据函数功能可以有返回值,也可以没有返回值,没有返回值称为过程。函数执行到该语句即结束,因此不要在其后写任何代码。

2.函数的调用

函数只有被调用后才真正开始执行函数体中的代码,执行完毕返回调用函数位置继续向下执行。

(1)通过函数名实现调用,可以在函数声明之前调用,也可以在声明之后调用。

(2)如果函数有参数列表,可以通过传递参数改变函数内部代码的执行行为。

(3)如果函数有返回值,当函数执行完毕后函数名可当作保存返回值的变量使用。

6-43.php

  <?php
  		function fun($a)
  		{
  			echo  $a*$a;
  		}
  		echo "5的平方是:";
  		fun(5);
  	?>

运行效果如图6-37所示。

image

图6-37 运行效果

3.函数返回值

只依靠函数来完成某些功能还不够,有时也需要使用函数执行后的结果。函数执行完毕后可返回一个值给它的调用者,这个值称为函数的返回值,通过return语句来实现。

return语句可以将函数的值传递给函数的调用者,同时也终止了函数的执行。return语句最多只能返回一个值,如果需要返回多个值,可以把要返回的值存入数组,返回一个数组;如果不需要返回任何值,而是结束函数的执行,可以只使用return。

6-44.php

  <?php
  		function fun($a)
  		{
  			return  $a*$a;
  		}
  		echo "5的平方是:".fun(5);
  	?>

运行效果如图6-38所示。

image

图6-38 运行效果

4.函数的参数

函数在定义时如果带有参数,那么在函数调用时需要向函数传递数据。PHP支持函数参数传递的方式有按值传递、按引用传递和默认参数三种。

1)按值传递方式

按值传递是函数默认的参数传递方式,将实参的值复制到对应的形参中。该方式的特点:在函数内部对形参的任何操作,对实参的值都不会产生影响。

6-45.php

  <?php
  		$a=3;
  		echo '函数调用前全局变量$a='.$a."<br/>";
  		function fun($a)
  		{
  			$a=$a+10;
  			echo '函数执行时局部变量$a='.$a."<br/>";
  		}
  		fun($a);
  		echo '函数调用后全局变量$a='.$a;
  	?>

运行效果如图6-39所示。

image

图6-39 运行效果

2)按引用传递方式

按引用传递是将实参在内存中分配的地址传递给形参。该方式的特点:在函数内部的所有操作都会影响到实参的值。也就是说在函数内部修改了形参的值,函数调用结束后,实参的值也会发生改变。

引用传递方式需要函数定义时在形参前加上“&”号。

6-46.php

  <?php
  		$a=3;
  		echo '函数调用前全局变量$a='.$a."<br/>";
  		function fun(&$a)
  		{
  			$a=$a+10;
  			echo '函数执行时局部变量$a='.$a."<br/>";
  		}
  		fun($a);
  		echo '函数调用后全局变量$a='.$a;
  	?>

运行效果如图6-40所示。

image

图6-40 运行效果

3)默认参数

PHP中还支持在定义函数时可以为一个或多个形参指定默认值。默认值必须是常量表达式,也可以是NULL;并且当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧。

6-47.php

  <?php
  		
  		function fun($a,$b=50)
  		{
  			return $a+$b;
  			
  		}
  		
  		echo "fun(10)=".fun(10)."<br/>";
  		echo "fun(10,20)=".fun(10,20)."<br/>";
  	?>

运行效果如图6-41所示。

image

图6-41 运行效果

6.5.3 函数和变量作用域

PHP中也有全局变量与局部变量的概念,并且具有相同的处理方法。PHP认可两种类型的变量作用域——函数作用域和页面作用域。函数作用域指此变量用于单个函数,这是变量通常的默认作用域;页面作用域是指变量应该用于整个页面,使用它时,需要用到global这个关键字。

6-48.php

  <?php
  		$a=1;
  		$b=2;
  		function sum()
  		{
  			global $a;	
  			$b=5;		//局部变量
  			return $a+$b; 	//是将全局变量$a与局部变量$b的值相加
  		}
  		echo "sum()执行结果:".sum();
  ?>

运行效果如图6-42所示。

image

图6-42 运行效果

注意:如果在函数中全局变量与局部变量同名,有效的是局部变量。

6-49.php

  <?php
  		$a=1;
  		$b=2;
  		function sum()
  		{
  			global $a,$b;	
  			$b=5;		//局部变量
  			return $a+$b; 	//是将全局变量$a与局部变量$b的值相加
  		}
  		echo "sum()执行结果:".sum();
  		
  	?>

运行效果如图6-43所示。

image

图6-43 运行效果

在全局范围内访问变量的第二个办法,是用特殊的PHP自定义$GLOBALS数组。

6-50.php

  <?php
  		$a=1;
  		$b=2;
  		function sum()
  		{
  			
  			$b=5;				//局部变量
  			return $GLOBALS['a']+$b;	//是将全局变量$a与局部变量$b的值相加
  		}
  		echo "sum()执行结果:".sum();
  	?>

运行效果如图6-44所示。

image

图6-44 运行效果

变量范围的另一个重要特性是静态变量。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。

6-51.php

  <?php
  		function Test()
  		{
     			static $a = 0;
     			 echo $a."<br>";
      		 $a++;
  		}
  		Test();
  		Test();
  	?>

运行效果如图6-45所示。

image

图6-45 运行效果

6.5.4 函数高级应用

介绍了函数的定义与使用后,本节将讲解函数的高级应用。

1.递归函数

递归函数即自调用函数,在函数体内直接或间接地自己调用自己。通常此类函数体中会包含条件判断,以分析是否需要执行递归调用;并指定特定条件以终止递归动作。

6-52.php

  <?php
  		function jiecheng ($n)
  		{
  			
  			
  			 if ($n-1>0)
  			 {
  				return $n*jiecheng($n-1)	;
  			}
  			else
  			{
  				return 1;
  			}
  				
  		}
  		$n=5;
  		echo "$n!=".jiecheng($n);
  	?>

运行效果如图6-46所示。

image

图6-46 运行效果

2.变量函数

在PHP中支持变量函数,也就是可以声明一个变量,通过变量来访问函数。如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且将尝试执行它。

6-53.php

  <?php
  		function fun()
  		{
  			echo "函数fun被调用";
  		}
  		$f="fun";
  		$f();
  	?>

运行效果如图6-47所示。

image

图6-47 运行效果

3.函数的引用

函数参数的传递可以按照引用传递,这样可以修改实参的值。引用不仅可用于函数参数,也可以用于函数本身。对函数的引用,就是对函数返回值的引用。对函数的引用,是在函数名前加“&”符号来实现的。

6-54.php

  <?php
  		function &fun()
  		{
  			static $b=0;
  			echo '$b:'.$b."<br/>";
  			return $b;
  		}
  		
  		$f=&fun();	//$f与函数返回值$b对应同一个存储空间
  		echo '$f:'.$f."<br/>";
  		$f=5;
  		fun();
  	?>

运行效果如图6-48所示。

image

图6-48 运行效果

教程类别