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 相关文章推荐
基于OpenCV的PHP图像人脸识别技术
Oct 11 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
PHP源码之explode使用说明
Aug 05 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
探讨捕获php错误信息方法的详解
Jun 09 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
Dec 17 PHP
主流PHP框架的优缺点对比分析
Dec 25 PHP
php 从一个数组中随机的取出若干个不同的数实例
Dec 31 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 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
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
php处理json时中文问题的解决方法
2011/04/12 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
IE与firefox之jquery用法区别
2008/10/03 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
python利用不到一百行代码实现一个小siri
2017/03/02 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
工程业务员岗位职责
2013/12/31 职场文书
美国留学经济担保书
2014/05/20 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
Java 多线程协作作业之信号同步
2022/05/11 Java/Android