php中的动态调用实例分析


Posted in PHP onJanuary 07, 2015

本文实例讲述了php中的动态调用具体用法。分享给大家供大家参考。具体分析如下:

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

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

elesif(){} 

…… 

else{echo "嗯!";}

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

进入正题,看看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(); 

?>

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

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
PHP如何透过ODBC来存取数据库
Oct 09 PHP
PHP中str_replace函数使用小结
Oct 11 PHP
php设计模式 Prototype (原型模式)代码
Jun 26 PHP
PHP几个数学计算的内部函数学习整理
Aug 06 PHP
使用PHP遍历文件夹与子目录的函数代码
Sep 26 PHP
php重定向的三种方法分享
Feb 22 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
测试php函数的方法
Nov 13 PHP
php支付宝接口用法分析
Jan 04 PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 PHP
PHP 无限级分类
May 04 PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 PHP
Zend Guard使用指南及问题处理
Jan 07 #PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 #PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 #PHP
PHP中使用CURL获取页面title例子
Jan 07 #PHP
PHP中调用SVN命令更新网站方法
Jan 07 #PHP
PHP PDO fetch 模式各种参数的输出结果一览
Jan 07 #PHP
PHP中使用php5-ffmpeg撷取视频图片实例
Jan 07 #PHP
You might like
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
求得div 下 img的src地址的js代码
2007/02/28 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
Python编程实现正则删除命令功能
2017/08/30 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
python调用接口的4种方式代码实例
2019/11/19 Python
Python如何计算语句执行时间
2019/11/22 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
电子商务应届生自我鉴定
2014/01/13 职场文书
初一家长会邀请函
2014/01/31 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
会计工作总结范文2014
2014/12/23 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
签证工作证明模板
2015/06/15 职场文书
道士塔读书笔记
2015/06/30 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android