怎么在php项目中实现动态调用
创始人
2024-12-12 16:01:40
0次

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

复制代码 代码如下:

if($fun='a'){echo "哎呀!";}
elesif(){}
……
else{echo "嗯!";}


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

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

复制代码 代码如下:

//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被调用!";
}
?>


实例代码如下:

复制代码 代码如下:

 require_once showErrMsg.php;
 $_action = (isset($_REQUEST[action])?$_REQUEST[action]:"");
 if($_action!=null&&$_action!=){
  if(function_exists($_action)){
   eval("$_action();");
  }else{
   die(showErrMsg ( "
当前php文件中不存在方法[".$_action."()]。"));
  }
 }
?>
 
function showErrMsg($strMsg){
  return "".$strMsg."";
 }
?>


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

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

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

问题的重点:

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

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

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

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

然而我也很不幸的告诉你:其实这段看起来整齐的代码有一个巨大的安全隐患在里面,很大,很大的安全隐患,具体是啥,感兴趣的朋友可以参考相关文档,相信你肯定不会把这一段代码立马用到服务器上的?

另外经过测试证实,这个方法不但可以动态调用函数,并且也可以动态实例化对象,像这样:

复制代码 代码如下:

$obj = new $obj();

代码如下:

复制代码 代码如下:

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();
?>


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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...