^ 回到顶部
  • 人生没有定律,每个人都有自己的节奏
  • 本站wordpress建站教程均通过实践后发布,希望对你有帮助,如果有代码出错,请联系站长解决
  • 希望你的坚持,都是因为热爱,而不是因为不甘心
  • 8年wordpress建站经验,5星服务品质
  • 那些不愿意让你吃亏的人,才是真正值得你深交的人,也是值得你付出时间的人
  • 腾讯云3年2核2G新品轻量限时特惠只需408元

零起点php入门第11课-php函数(2)

这节课,陌小雨继续带大家学习 php 函数的其他内容。

1、变量的作用域

2 核 2G 限时特惠 396 元/3 年    宝塔建站 10850 大礼包

变量的作用域即变量可使用的范围。函数中变量的作用是即整个函数体内,因此在函数内部与外部的同名变量是不同的。

<?php	
	function add(){			//定义函数 add
		$m=2;			//函数内部定义并初始化两个变量
		$n=3;
		return $m+$n;
	}
	$m=12;			//函数外部定义两个同名变量
	$n=8;
	echo '调用函数输出结果:'.add();
	echo '<br />函数外部输出结果:'.($m+$n);
?>

代码运行结果:

调用函数输出结果:5
函数外部输出结果:20

在代码中我们可以看到函数内和函数外的变量是不同的,否则函数外部输出结果也将是 5 而不是 20。

<?php
	function print_num(){			//定义函数
		$x=6;			//在函数中定义变量
	}
	print_num();		//调用函数
	echo $x;
?>

代码运行结果:(无内容)

(代码在运行后输出了一个变量为定义的提示,这就证明了在函数外部不能够读取到函数内部定义的变量。)

2、全局变量

如果需要在函数中使用函数外的变量那么就需要使用 global 来声明一个全局变量,它的一般形式如下所示:

global 变量 1,变量 2,变量 3…

<?php
	function test(){		//定义函数
		global $a;		//声明全局变量
        echo $a;		
	}
	$a=7;
	test();			//调用函数
?>

代码运行结果:7

从运行结果我们可以看到,虽然在函数中并没有定义变量 a,但是调用函数时仍然输出了变量 a 的值,这就是 global 定义的作用。

3、静态变量

变量作用域的另一个体现就是静态变量。静态变量可以使函数中的变量状态保留而不会被销毁。首先看一段不使用静态变量的示例。

<?php
	function test(){		//定义函数
		$a=0;			//定义变量
		$a++;			//变量递增
		echo $a;		//输出变量值
	}
	test();			//第一次调用函数
	test();			//第二次调用函数
	test();			//第三次调用函数
?>

代码运行结果:111

以上输出结果证明了三次调用函数均输出 1,也就是说函数中的变量 a 的值在每次调用中均会被初始化。

静态变量使用 static 关键字定义,形式如下所示:

static 变量名=初始值;

<?php
	function test(){		//定义函数
		static $a=0;			//定义静态变量
		$a++;			//变量递增
		echo $a;		//输出变量值
	}
	test();			//第一次调用函数
	test();			//第二次调用函数
	test();			//第三次调用函数
?>

代码运行结果:123

以上代码仅在之前的基础上定义了静态变量,但是输出结果却是不同的,这就是因为静态变量的状态会被保留因而可以实现递增

4、函数的其他使用方法

变量除了已经讲解的常用使用方法之外,还有一些其他的使用方法,包括函数的递归调用、可变函数、匿名函数和函数的引用返回。

(1)可变函数

可变函数是指以一个变量作为函数名来调用函数。因此同样的形式会随着变量值的改变而调用不同的函数,常用的形式如下所示:

$variable()

<?php
	function hello(){			//定义函数
		echo '<br />Hello!<br />';
	}
	function hellophp(){		//定义函数
		echo '<br />Hello PHP!<br />';
	}
	function good(){			//定义函数
		echo '<br />PHP is very good!<br />';
	}
	$func='good';			//定义变量 func
	$func2='hello';			//定义变量 func2
	$func();			//变量作为函数名 good()
	$func2();			//变量作为函数名 hello()
	$func='hellophp';		//对变量 func 重新赋值
	$func();		//变量作为函数名 hellophp()
?>

代码运行结果:

PHP is very good!

Hello!

Hello PHP!

(2)函数的引用返回

函数的引用返回常用于使函数内的变量与函数外的变量建立联系,因而可以通过读取或者修改函数外变量的值来读取或者修改函数内的变量的值。引用返回的函数形式如下所示:

function &函数名(参数列表){
函数体;
return 返回值;
}

<?php
	function &test(){		//定义函数
		static $a=0;			//定义变量
		$a++;			//变量递增
		return $a;		//返回变量值
	}
	$quote=&test();			//建立联系
	echo "\$a=$quote";			//输出函数中变量 a 的值
	test();			//调用函数
	test();			//调用函数
	echo "<br />\$a=$quote";			//输出函数中变量 a 的值
	$quote=15;			//改变返回值$a 的值
	test();			//调用函数
	echo "<br />\$a=$quote";			//输出函数中变量 a 的值
?>

代码运行结果:

$a=1
$a=3
$a=16

从运行结果我们可以看到,函数在外部就实现了静态变量 a 从 3 到 16 的跨越却只需要进行一次赋值。而不使用引用返回想要达到同样的结果就需要多次重复调用函数。

(3)函数的递归调用

函数的递归调用即在函数体内调用函数自身。通常的形式如下所示:

function func_name(…){
…;
func_name(…);
…;
}

下面就通过一个简单的题目来学习递归调用的使用方法,题目如下:初始情况下有一个细胞,它每 2 分钟会分裂出 1 个细胞。新生细胞有 1 分钟的成熟期,成熟后的细胞每 2 分钟会分裂出一个细胞。我们就来设计程序计算 15 分钟后共有多少细胞。

<?php
	function cell($start,$end){			//定义细胞函数,参数 start 为开始时间,end 为结束时间
		global $sum;
		for($i=$start+1;$i<$end;$i=$i+2)
			if($i+2<=$end){
				cell($i+2,$end);		//递归调用
				$sum=$sum+1;
			}
	}
	$sum=1;
	cell(-1,35);		//由于开始时候是有一个成熟的细胞,因此需要将时间提前 1 分钟
	echo "15 分钟后为$sum 个细胞。";
?>

递归调用是比较耗费系统资源的,虽然 15 分钟的细胞数可以很容易地计算出来,但是计算一个比较长的时间浏览器通常会响应比较长的时间。

(4)匿名函数

匿名函数也称为闭包函数,它是一个没有函数名的函数,通常会作为回调函数的参数,它的形式如下所示:

function (参数列表){
语句;
}

匿名函数也可以与一个变量绑定,常用形式如下所示:

$varable = function (参数列表){
语句;
}

匿名函数作为回调函数参数的知识陌小雨不在这里讲解,下面我们就以匿名函数与变量绑定的形式来学习。

<?php
	$func=function ($x,$y){			//匿名函数与变量绑定
		return $x+$y;
	};
	echo '5+6='.$func(5,6);			//使用匿名函数
	echo '<br />15+16='.$func(15,16);	
?>

代码运行结果:

5+6=11
15+16=31

在将匿名函数与变量绑定的时候需要注意在匿名函数结尾需要以分号结束,这类似于为变量赋值。

总结:陌小雨共通过两节课讲解了 PHP 函数部分的知识,包括使用函数的优势以及详细讲解了函数的各种使用方法。让大家使用函数时候基本没有盲点。函数的递归调用是初学者比较难掌握的知识,我们现在无需完全理解递归,递归的知识将在不断的学习和实践中会逐渐深入理解。

赠人玫瑰,手有余香。