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编程与应用
Oct 09 PHP
php MYSQL 数据备份类
Jun 19 PHP
php 文件夹删除、php清除缓存程序
Aug 25 PHP
深入PHP异步执行的详解
Jun 03 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
PHP在线调试执行的实现方法(附demo源码)
Apr 28 PHP
joomla实现注册用户添加新字段的方法
May 05 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
Oct 18 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
Apr 23 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 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导入导出excel实例
2013/10/25 PHP
php Session存储到Redis的方法
2013/11/04 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Win8下python3.5.1安装教程
2020/07/29 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
keras 权重保存和权重载入方式
2020/05/21 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
就业推荐自我鉴定
2013/10/06 职场文书
初中校园之声广播稿
2014/01/15 职场文书
学生安全承诺书
2014/05/22 职场文书
公司周年庆活动方案
2014/08/25 职场文书
2015年党建工作总结
2015/03/30 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang