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 正则 过滤html 的超链接
Jun 02 PHP
Php Image Resize图片大小调整的函数代码
Jan 17 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
Jun 28 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
php递归遍历多维数组的方法
Apr 18 PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
在Debian系统下配置LNMP的教程
Jul 09 PHP
php计算title标题相似比的方法
Jul 29 PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 PHP
php中的buffer缓冲区用法分析
May 31 PHP
php7下的filesize函数
Sep 30 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 编写的 25个游戏脚本
2009/05/11 PHP
php foreach、while性能比较
2009/10/15 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
js 文件引入实现代码
2010/04/23 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
js简单实现标签云效果实例
2015/08/06 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
Python 单元测试(unittest)的使用小结
2018/11/14 Python
python使用knn实现特征向量分类
2018/12/26 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
自荐信如何“自荐”
2013/10/24 职场文书
小学班主任寄语大全
2014/04/04 职场文书
护理专业自荐书
2014/06/04 职场文书
幼儿园课题方案
2014/06/09 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
交通安全横幅标语
2014/10/07 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书