网站地图    收藏   

主页 > php专栏 > php应用 >

php中动态调用说明 - php高级应用

来源:自学PHP网    时间:2014-11-27 22:16 作者: 阅读:

[导读] 动态调用在php算是高级的东西了,今天我们来看看这高级的活是什么吧,先来分析一下判断什么是这个动态调用,有需要的朋友看看吧.在程序中如果加一大堆判断的确是一个很大的麻烦,例如...

php中动态调用说明

动态调用在php算是高级的东西了,今天我们来看看这高级的活是什么吧,先来分析一下判断什么是这个动态调用,有需要的朋友看看吧.

在程序中如果加一大堆判断的确是一个很大的麻烦,例如这样:

  1. if($fun=’a’){echo ”哎呀!”;} 
  2. elesif(){} 
  3. …… 
  4. else{echo “嗯!”;}; 

真的很麻烦并且造成程序后期阅读和修改时候的巨大麻烦,这时候我们可以把每一个要执行的代码段,用函数来实现,然后可以用一个更加NB的方法来实现这些功能,并且因为每一个函数实现一个功能,我们维护起来就简单多了.

进入正题,看看PHP动态调用函数到底有什么作用,在PHP中是可以动态调用函数的,像这样$fun(),PHP解析器可以根据变量$fun的值来调用对用的函数,例如$fun=’a’,解析器看到的将是a();这样的形式,从而调用函数a,具体代码如下:

  1. <?php 
  2. //程序来源:PHP iask http://www.phpfensi.com 
  3. //controller.php 
  4. (isset($_GET['fun'])&&$_GET['fun']!='')?$fun=$_GET['fun']:$fun='def'
  5.  
  6. controller($fun); 
  7.  
  8. function controller($fun){ 
  9.      if(function_exists($fun)) $fun(); 
  10.      else echo "函数{$fun}未定义"
  11.  
  12. function def(){ 
  13.      echo "由于用户没有传递参数,调用了缺省的函数def()"
  14. function a(){ 
  15.     echo "函数a被调用!"
  16. function b(){ 
  17.     echo "函数b被调用!"
  18. ?> 

实例代码如下:

  1. <?php 
  2.  require_once showErrMsg.php; 
  3.  $_action = (isset($_REQUEST[action])?$_REQUEST[action]:""); 
  4.  if($_action!=null&&$_action!=){ 
  5.   if(function_exists($_action)){ 
  6.    eval("$_action();"); 
  7.   }else
  8.    die(showErrMsg ( "<br>当前php文件中不存在方法[<b>".$_action."()</b>]。")); 
  9.   } 
  10.  } 
  11. ?> 
  12.  
  13. <?php 
  14. function showErrMsg($strMsg){ 
  15.   return "<font color=red>".$strMsg."</font>"
  16.  } 
  17. ?> 

在前台页面我们可以用不同的链接来实现不同的功能,例如我们有这样一个链接

http://localhost/controller.php?fun=a

当请求到达controller.php的时候,PHP程序将会自动的执行函数a().

问题的重点:

在于我们在这个程序的页面首先调用了controller()函数。这个函数首先判断参数中定义的函数名称($fun的值)是否被定义,如果定义了就调用这个函数。

如果在$_GET参数中fun没有定义:http://localhost/controller.php

就调用一个缺省的函数def();

这样的代码是不是简洁很对呢?你可以把这些代码拷贝回去,自己看看效果——我肯定的告诉你,这些代码运行时正常的!

然而我也很不幸的告诉你:其实这段看起来整齐的代码有一个巨大的安全隐患在里面,很大,很大的安全隐患,具体是啥,留到明天10点钟准时上线的《关于PHP动态调用函数的安全问题》再说吧,你肯定不会把这一段代码立马用到服务器上吧?

另外经过测试证实,这个方法不但可以动态调用函数,并且也可以动态实例化对象,像这样:$obj = new $obj();代码如下:

  1. <?php 
  2. class A 
  3.       function foo() 
  4.       { 
  5.           if (isset($this)) { 
  6.               echo '$this is defined ('
  7.               echo get_class($this); 
  8.               echo ")n"
  9.           } else { 
  10.               echo "$this is not defined.n"
  11.           } 
  12.       } 
  13.  
  14. class B 
  15.       function bar() 
  16.       { 
  17.         A::foo(); 
  18.          //parent::foo(); 
  19.       } 
  20.  
  21. $a = new A(); 
  22. $a->foo();//动态调用,因为new了对象 
  23. A::foo();//静态调用,直接用类名去调用,没有new对象 
  24. $b = new B(); 
  25. //开源代码phpfensi.com 
  26. $b->bar();//在对象$b中,A::foo();进行静态调用 
  27. B::bar(); 
  28. ?> 

总结:静态、动态调用都指类、对象对其方法的调用,动态指的是创建(new)了对象,然后用对象变量去调用方法;静态则是没有创建对象,直接用类名去调用,至于另一个对象那就很简单了,不同的类创建不同的对象,比如class A;class B ,$a = new A();$b = new B();$a and $b 相对之间就是另一个对象了.

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论