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学习 计数器实例代码
Jun 15 PHP
php 获取本地IP代码
Jun 23 PHP
PHP 使用memcached简单示例分享
Mar 05 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
解析WordPress中函数钩子hook的作用及基本用法
Dec 22 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
Mar 21 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
php错误日志简单配置方法
Jul 11 PHP
php set_include_path函数设置 include_path 配置选项
Oct 30 PHP
PHP 文件上传限制问题
Sep 01 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
Jan 22 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面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
js排序与重组的实例讲解
2017/08/28 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
python爬虫增加访问量的方法
2019/08/22 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
Python tkinter常用操作代码实例
2020/01/03 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
opencv python如何实现图像二值化
2020/02/03 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
Ellos丹麦:时尚和服装在线
2016/09/19 全球购物
12岁生日感言
2014/01/21 职场文书
学习十八届三中全会精神实施方案
2014/02/17 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server