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 加密解密内部算法
Apr 22 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
Jun 21 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
Jul 01 PHP
php中删除数组的第一个元素和最后一个元素的函数
Mar 07 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
ThinkPHP中limit()使用方法详解
Apr 19 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
php使用curl详细解析及问题汇总
Aug 11 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
laravel config文件配置全局变量的例子
Oct 13 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
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
js指定日期增加指定月份的实现方法
2018/12/19 Javascript
Python完全新手教程
2007/02/08 Python
Python 字典(Dictionary)操作详解
2014/03/11 Python
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
Python重新引入被覆盖的自带function
2014/07/16 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
python3 shelve模块的详解
2017/07/08 Python
用Python逐行分析文件方法
2019/01/28 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
Python如何批量生成和调用变量
2020/11/21 Python
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
物理系毕业生自荐信
2013/11/01 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
学校学期工作总结
2015/08/13 职场文书
简短的人生哲理(38句)
2019/08/13 职场文书
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏