if($fun='a'){echo "哎呀!";} elesif(){} …… else{echo "嗯!";}
进入正题,看看PHP动态调用函数到底有什么作用,在PHP中是可以动态调用函数的,像这样$fun(),PHP解析器可以根据变量$fun的值来调用对用的函数,例如$fun='a',解析器看到的将是a();这样的形式,从而调用函数a,具体代码如下:
<?php //controller.php (isset($_GET['fun'])&&$_GET['fun']!='')?$fun=$_GET['fun']:$fun='def'; controller($fun); function controller($fun){ if(function_exists($fun)) $fun(); else echo "函数{$fun}未定义"; } function def(){ echo "由于用户没有传递参数,调用了缺省的函数def()"; } function a(){ echo "函数a被调用!"; } function b(){ echo "函数b被调用!"; } ?>
<?php require_once showErrMsg.php; $_action = (isset($_REQUEST[action])?$_REQUEST[action]:""); if($_action!=null&&$_action!=){ if(function_exists($_action)){ eval("$_action();"); }else{ die(showErrMsg ( "<br>当前php文件中不存在方法[<b>".$_action."()</b>]。")); } } ?> <?php function showErrMsg($strMsg){ return "<font color=red>".$strMsg."</font>"; } ?>
http://localhost/controller.php?fun=a
当请求到达controller.php的时候,PHP程序将会自动的执行函数a().
问题的重点:
在于我们在这个程序的页面首先调用了controller()函数。这个函数首先判断参数中定义的函数名称($fun的值)是否被定义,如果定义了就调用这个函数。
如果在$_GET参数中fun没有定义:http://localhost/controller.php
就调用一个缺省的函数def();
这样的代码是不是简洁很对呢?你可以把这些代码拷贝回去,自己看看效果――我肯定的告诉你,这些代码运行时正常的!
然而我也很不幸的告诉你:其实这段看起来整齐的代码有一个巨大的安全隐患在里面,很大,很大的安全隐患,具体是啥,感兴趣的朋友可以参考相关文档,相信你肯定不会把这一段代码立马用到服务器上的?
另外经过测试证实,这个方法不但可以动态调用函数,并且也可以动态实例化对象,像这样:
$obj = new $obj();代码如下:
<?php class A { function foo() { if (isset($this)) { echo '$this is defined ('; echo get_class($this); echo ")n"; } else { echo "$this is not defined.n"; } } } class B { function bar() { A::foo(); //parent::foo(); } } $a = new A(); $a->foo();//动态调用,因为new了对象 A::foo();//静态调用,直接用类名去调用,没有new对象 $b = new B(); $b->bar();//在对象$b中,A::foo();进行静态调用 B::bar(); ?>
希望本文所述对大家的php程序设计有所帮助。