Rumah php教程 php手册 php中动态调用说明

php中动态调用说明

May 25, 2016 pm 04:39 PM

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

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

if($fun='a'){echo "哎呀!";} 
elesif(){} 
…… 
else{echo "嗯!";};
Salin selepas log masuk

真的很麻烦并且造成程序后期阅读和修改时候的巨大麻烦,这时候我们可以把每一个要执行的代码段,用函数来实现,然后可以用一个更加NB的方法来实现这些功能,并且因为每一个函数实现一个功能,我们维护起来就简单多了.

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

<?php 
//程序来源:PHP iask http://www.phprm.com 
//controller.php 
(isset($_GET[&#39;fun&#39;])&&$_GET[&#39;fun&#39;]!=&#39;&#39;)?$fun=$_GET[&#39;fun&#39;]:$fun=&#39;def&#39;; 
 
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被调用!"; 
}
Salin selepas log masuk

实例代码如下:

<?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>"; 
}
Salin selepas log masuk

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

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 &#39;$this is defined (&#39;; 
          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(); 
//开源代码phprm.com 
$b->bar();//在对象$b中,A::foo();进行静态调用 
B::bar();
Salin selepas log masuk

总结:静态、动态调用都指类、对象对其方法的调用,动态指的是创建(new)了对象,然后用对象变量去调用方法;静态则是没有创建对象,直接用类名去调用,至于另一个对象那就很简单了,不同的类创建不同的对象,比如class A;class B ,$a = new A();$b = new B();$a and $b 相对之间就是另一个对象了.


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)