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 相关文章推荐
解决控件遮挡问题:关于有窗口元素和无窗口元素
Jan 28 PHP
PHP学习之数组值的操作
Apr 17 PHP
PHP编程函数安全篇
Jan 08 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
关于URL最大长度限制的相关资料查证
Dec 23 PHP
php绘图之在图片上写中文和英文的方法
Jan 24 PHP
php 问卷调查结果统计
Oct 08 PHP
微信公众号开发之语音消息识别php代码
Aug 08 PHP
php生成网页桌面快捷方式
May 05 PHP
PHP用户注册邮件激活账户的实现代码
May 31 PHP
Laravel实现通过blade模板引擎渲染视图
Oct 25 PHP
php array_map()函数实例用法
Mar 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
推荐25款php中非常有用的类库
2014/09/29 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
js对象与打印对象分析比较
2013/04/23 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
js实现文本框中焦点在最后位置
2014/03/04 Javascript
JS烟花背景效果实现方法
2015/03/03 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
[01:08:44]NB vs VP 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
python编写简易聊天室实现局域网内聊天功能
2018/07/28 Python
Python微信操控itchat的方法
2019/05/31 Python
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
2010/07/20 HTML / CSS
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
经理职责范文
2013/11/08 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
绿色学校实施方案
2014/03/31 职场文书
专项法律服务方案
2014/06/11 职场文书
倡议书格式及范文
2015/04/29 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
寻衅滋事罪辩护词
2015/05/21 职场文书
升学宴来宾致辞
2015/07/27 职场文书
Python编程编写完善的命令行工具
2021/09/15 Python