首页 > php框架 > php中动态调用说明

php中动态调用说明

动态调用在php算是高级的东西了,今天我们来看看这高级的活是什么吧,先来分析一下判断什么是这个动态调用哦,有需要的朋友看看吧。

在程序中如果加一大堆判断的确是一个很大的麻烦!例如这样:

if($fun=’a’){echo ”哎呀!”;}

elesif(){}

……

else{echo “嗯!”;};

真的很麻烦并且造成程序后期阅读和修改时候的巨大麻烦!

这时候我们可以把每一个要执行的代码段,用函数来实现。

然后可以用一个更加NB的方法来实现这些功能。

并且因为每一个函数实现一个功能,我们维护起来就简单多了。

进入正题,看看PHP动态调用函数到底有什么作用:

在PHP中是可以动态调用函数的,像这样$fun(),PHP解析器可以根据变量$fun的值来调用对用的函数,例如$fun=’a’,解析器看到的将是a();这样的形式,从而调用函数a。具体代码如下:

 
<?php
//程序来源:PHP iask
//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();

这样的代码是不是简洁很对呢?你可以把这些代码拷贝回去,自己看看效果——我肯定的告诉你,这些代码运行时正常的!

然而我也很不幸的告诉你:其实这段看起来整齐的代码有一个巨大的安全隐患在里面,很大,很大的安全隐患!具体是啥,留到明天10点钟准时上线的《关于PHP动态调用函数的安全问题》再说吧,你肯定不会把这一段代码立马用到服务器上吧?

另外经过测试证实,这个方法不但可以动态调用函数,并且也可以动态实例化对象,像这样:$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 相对之间就是另一个对象了。


本文地址:http://www.phprm.com/frame/php1005248.html

转载随意,但请附上文章地址:-)

标签:none

发表留言