PHP-函数小记

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  ?>

 

posted @ 2018-01-19 18:40  帕特菛琦  阅读(119)  评论(0编辑  收藏  举报