1.函数可以调用在前声明在后
1 <?php 2 /*变量只可以调用先声明后调用*/ 3 $var1="变量1"; 4 $var2=array(1,2,3,4); 5 echo $var1;print_r($var2); 6 7 8 /*函数可以调用在前声明在后*/ 9 test(); 10 $var3=4; 11 $var4=null; 12 function test(){ 13 echo "test()执行"; 14 } 15 16 /*静态变量也可以先调用后声明*/ 17 echo test2::$sta; 18 class test2{ 19 static $sta="静态变量"; 20 } 21 ?>
PHP虽然是脚本语言,但也是需要先编译后执行的。
在编译过程中,函数,类等长度较大的代码块会被读入到堆内存中,程序的执行代码会被读入到代码段,静态数据被读入到初始化数据段。
程序执行时,计算机逐一从代码段取出代码按顺序执行,遇到声明变量的语句,则将变量存入栈内存。
所以,程序执行之初,函数、类、静态变量就已经在内存中放好了。而变量是执行到声明语句时才进入栈内存的,如果你提前调用,计算机根本不知道它是什么。
2.变量作用域与生命周期
1 <?php 2 $var1="全局变量1"; 3 $var2="全局变量2"; 4 5 define(‘TEST‘, ‘testdefine‘); 6 7 const TEST2=‘testconst‘; 8 9 function test($p){ 10 global $var1; 11 echo $var1; 12 echo $GLOBALS[‘var2‘];//全局变量在函数内部无法直接调用,只可以用这两种方法 13 14 echo TEST; 15 echo TEST2; 16 echo test2::$st;//常量与静态变量无视作用域可以直接调用 17 18 $aaa; 19 } 20 test();//函数体内的局部变量$aaa和$p在函数执行完毕后就会销毁 21 //即使以后还会调用该函数,也是重新声明新的变量,原来的变量找不回来 22 23 class test2{ 24 static $st="静态变量"; 25 } 26 27 //全局变量,常量,静态变量的生命周期直到代码运行结束 28 ?>
注:函数体内部不可以定义常量,会出现错误。
3.PHP为变量指定数据类型
1 <?php 2 int $a;//为变量指定数据类型 3 4 /*为函数的返回值和参数指定数据类型*/ 5 int function test(int $i) 6 { 7 return $i+1; 8 } 9 10 /*在这里就和强类型语言一样,如果传递的值不符合指定的数据类型会出错*/ 11 /*不同的是PHP中不允许函数重载*/ 12 ?>
4.值传递与引用传递
1 <?php 2 /*数组赋值是值传递*/ 3 $a=array(1,3,2); 4 $b=$a; 5 6 sort($a); 7 8 var_dump($a);//$a=arrar(1,2,3) 9 var_dump($b);//$b=array(1,3,2) 10 11 /********************************/ 12 13 /*对象赋值是引用传递*/ 14 class test{}; 15 $a=new test; 16 $a->name="hello"; 17 18 $b=$a; 19 20 var_dump($a);//$a=test{name=‘hello‘} 21 var_dump($b);//$b=test{name=‘hello‘} 22 23 $a->name="nihao"; 24 25 var_dump($a);//$a=test{name=‘nihao‘} 26 var_dump($b);//$a=test{name=‘nihao‘} 27 28 /************************************/ 29 30 /*引用最为函数的参数*/ 31 function increment(& $i) 32 { 33 $i++; 34 } 35 $a=1; 36 37 increment($a); 38 echo $a; 39 ?>
5.可变参数的函数
1 <?php 2 function test() 3 { 4 $args=func_get_args();//将参数作为数组返回 5 for ($i=0; $i < count($args); $i++) { //打印出每一个参数 6 echo $args[$i].‘<br>‘; 7 } 8 } 9 test(1,‘hell0‘,‘three‘,4,9); 10 ?>
6变量函数
1 <?php 2 /*可以将函数名的字符串赋值给一个变量,然后通过变量名()的方式调用函数*/ 3 function testfunc() 4 { 5 echo "this is atest"; 6 } 7 8 $a="testfunc"; 9 10 $a();//输出this is atest 11 ?>
7.回调函数
回调函数的本质就是作为参数被另一个函数调用的函数。
函数是一段执行特定行为的代码,我们可以将变量传递给函数的参数改变函数的行为特征。
但是参数仅仅是变量改变的行为是有限的,有时甚至需要传入一个函数作为参数,这就是回调函数。
1 <?php 2 /*通过变量函数的方式传入回调函数 */ 3 /*打印出1到$num的所有数字*/ 4 /*同时过滤掉满足fun的数字不打印*/ 5 function filter($num,$fun) 6 { 7 for ($i=1; $i <= $num ; $i++) { 8 if($fun($i)) continue; 9 echo $i."---"; 10 } 11 } 12 13 function f3($i) 14 { 15 if($i%3==0) return true; 16 else return false; 17 } 18 19 filter(100,‘f3‘);//将函数名作为字符串传入 20 ?>
8.call_user_func_array
1 <?php 2 /*打印出所有参数,有多少打印多少*/ 3 function listargs() 4 { 5 $args=func_get_args(); 6 for ($i=0; $i < count($args); $i++) { 7 echo $args[$i];echo "<br>"; 8 } 9 } 10 11 /*假设现在要打印出所有GET方式传过来的值,但是值的数量我们并不知道*/ 12 /*listargs($a1,$a2,...)这样的方式就用不了了,而我又不希望改写listargs的代码该怎么办呢*/ 13 14 call_user_func_array(‘listargs‘, $_GET);//第一个参数为函数名的字符串,第二个参数是数组,该函数的参数 15 16 ?>
1 <?php 2 class Test{ 3 public function test1($a,$b) 4 { 5 echo $a."-".$b; 6 } 7 8 static function test2($a,$b) 9 { 10 echo $a."+".$b; 11 } 12 } 13 14 //call_user_func_array(array(‘Test‘,‘test2‘),array(3,5));//调用类的静态函数 15 call_user_func_array(array(new Test,‘test1‘),array(3,5));//调用类的普通成员函数 16 ?>
用call_user_func_array()实现回调函数
1 <?php 2 /*通过call_user_func_array()的方式传入回调函数 */ 3 /*打印出1到$num的所有数字*/ 4 /*同时过滤掉满足fun的数字不打印*/ 5 function filter($num,$fun) 6 { 7 for ($i=1; $i <= $num ; $i++) { 8 //if($fun($i)) continue; 9 call_user_func_array($fun, array($i)); 10 echo $i."---"; 11 } 12 } 13 14 function f3($i) 15 { 16 if($i%3==0) return true; 17 else return false; 18 } 19 20 filter(100,‘f3‘);//将函数名作为字符串传入 21 ?>