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 相关文章推荐
C/S和B/S两种架构区别与优缺点分析
Oct 23 PHP
php获取YouTube视频信息的方法
Feb 11 PHP
使用 PHPStorm 开发 Laravel
Mar 24 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
Apr 17 PHP
PHP基于文件存储实现缓存的方法
Jul 20 PHP
ThinkPHP实现更新数据实例详解(demo)
Jun 29 PHP
PHP单态模式简单用法示例
Nov 16 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
May 15 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
PHPwind整合最土系统用户同步登录实现方法
2010/12/08 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
php格式化金额函数分享
2015/02/02 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
js 日期转换成中文格式的函数
2009/07/07 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
js初始化验证实例详解
2016/11/26 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
python 判断自定义对象类型
2009/03/21 Python
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
Python的装饰器用法学习笔记
2016/06/24 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
Python 学习教程之networkx
2019/04/15 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
Django和Flask框架优缺点对比
2019/10/24 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
ColourPop美国官网:卡拉泡泡,洛杉矶彩妆品牌
2019/04/28 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
煤矿安全生产责任书
2014/04/15 职场文书
超市优秀员工事迹材料
2014/05/01 职场文书
英语求职信范文
2014/05/23 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
python必学知识之文件操作(建议收藏)
2021/05/30 Python
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android
mysql中关键词exists的用法实例详解
2022/06/10 MySQL