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中用header图片地址 简单隐藏图片源地址
Apr 09 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 PHP
php导出CSV抽象类实例
Sep 24 PHP
解决nginx不支持thinkphp中pathinfo的问题
Jul 21 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
PHP实现支持加盐的图片加密解密
Sep 09 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
PHP使用Nginx实现反向代理
Sep 20 PHP
PHP操作Redis常用技巧总结
Apr 24 PHP
php给数组赋值的实例方法
Sep 26 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
Jun 24 PHP
一文搞懂PHP中的抽象类和接口
May 25 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
PHP的explode和implode的使用说明
2011/07/17 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php页面防重复提交方法总结
2013/11/25 PHP
php缓冲输出实例分析
2015/01/05 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
微信小程序日历组件使用方法详解
2018/12/29 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
工厂厂长岗位职责
2013/11/08 职场文书
八年级物理教学反思
2014/01/19 职场文书
安全生产实施方案
2014/02/23 职场文书
经典演讲稿汇总
2014/05/19 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript