• 技术文章 >后端开发 >php教程

    php中的动态调用实例分析_PHP

    2016-05-31 13:18:17原创356
    本文实例讲述了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 ( "
    当前php文件中不存在方法[".$_action."()]。"));
    }
    }
    ?>

    <?php
    function showErrMsg($strMsg){
    return "".$strMsg."";
    }
    ?>


    在前台页面我们可以用不同的链接来实现不同的功能,例如我们有这样一个链接

    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程序设计有所帮助。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 动态 调用
    上一篇:php计划任务之ignore_user_abort函数实现方法_PHP 下一篇:PHP实现的简易版图片相似度比较_PHP
    千万级数据并发解决方案

    相关文章推荐

    • Classes and Objects in PHP5-面向对象编程 [1]_PHP教程• nginx支持pathinfo模式• php 不使用js实现页面跳转_php技巧• PHP项目开发中最常用的自定义函数整理_php技巧• php自动跳转中英文页面_php技巧
    1/1

    PHP中文网