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 MemCached 高级缓存应用代码
Aug 05 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
May 07 PHP
php导出word文档与excel电子表格的简单示例代码
Mar 08 PHP
php最简单的删除目录与文件实现方法
Nov 28 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
用php代码限制国内IP访问我们网站
Sep 26 PHP
PHP中Closure类的使用方法及详解
Oct 09 PHP
PHP进程通信基础之信号量与共享内存通信
Feb 19 PHP
php 算法之实现相对路径的实例
Oct 17 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 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数据缓存技术
2007/02/14 PHP
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
深入讲解PHP的对象注入(Object Injection)
2017/03/01 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
python3实现基于用户的协同过滤
2018/05/31 Python
详解django.contirb.auth-认证
2018/07/16 Python
利用python实现周期财务统计可视化
2019/08/25 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
《泉水》教学反思
2014/04/11 职场文书
法学院毕业生求职信
2014/06/25 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书