動(dòng)態(tài)調(diào)用在php算是高級的東西了,今天我們來看看這高級的活是什么吧,先來分析一下判斷什么是這個(gè)動(dòng)態(tài)調(diào)用,有需要的朋友看看吧.
在程序中如果加一大堆判斷的確是一個(gè)很大的麻煩,例如這樣:
- if($fun=’a’){echo ”哎呀!”;}
- elesif(){}
- ……
- else{echo “嗯!”;};
真的很麻煩并且造成程序后期閱讀和修改時(shí)候的巨大麻煩,這時(shí)候我們可以把每一個(gè)要執(zhí)行的代碼段,用函數(shù)來實(shí)現(xiàn),然后可以用一個(gè)更加NB的方法來實(shí)現(xiàn)這些功能,并且因?yàn)槊恳粋€(gè)函數(shù)實(shí)現(xiàn)一個(gè)功能,我們維護(hù)起來就簡單多了.
進(jìn)入正題,看看PHP動(dòng)態(tài)調(diào)用函數(shù)到底有什么作用,在PHP中是可以動(dòng)態(tài)調(diào)用函數(shù)的,像這樣$fun(),PHP解析器可以根據(jù)變量$fun的值來調(diào)用對用的函數(shù),例如$fun=’a’,解析器看到的將是a();這樣的形式,從而調(diào)用函數(shù)a,具體代碼如下:
- <?php
- //程序來源:PHP iask http://m.survivalescaperooms.com
- //controller.php
- (isset($_GET['fun'])&&$_GET['fun']!='')?$fun=$_GET['fun']:$fun='def';
- controller($fun);
- function controller($fun){
- if(function_exists($fun)) $fun();
- else echo "函數(shù){$fun}未定義";
- }
- function def(){
- echo "由于用戶沒有傳遞參數(shù),調(diào)用了缺省的函數(shù)def()";
- }
- function a(){
- echo "函數(shù)a被調(diào)用!";
- }
- function b(){
- echo "函數(shù)b被調(diào)用!";
- }
- ?>
實(shí)例代碼如下:
- <?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>當(dāng)前php文件中不存在方法[<b>".$_action."()</b>]。"));
- }
- }
- ?>
- <?php
- function showErrMsg($strMsg){
- return "<font color=red>".$strMsg."</font>";
- }
- ?>
在前臺(tái)頁面我們可以用不同的鏈接來實(shí)現(xiàn)不同的功能,例如我們有這樣一個(gè)鏈接
http://localhost/controller.php?fun=a
當(dāng)請求到達(dá)controller.php的時(shí)候,PHP程序?qū)?huì)自動(dòng)的執(zhí)行函數(shù)a().
問題的重點(diǎn):
在于我們在這個(gè)程序的頁面首先調(diào)用了controller()函數(shù)。這個(gè)函數(shù)首先判斷參數(shù)中定義的函數(shù)名稱($fun的值)是否被定義,如果定義了就調(diào)用這個(gè)函數(shù)。
如果在$_GET參數(shù)中fun沒有定義:http://localhost/controller.php
就調(diào)用一個(gè)缺省的函數(shù)def();
這樣的代碼是不是簡潔很對呢?你可以把這些代碼拷貝回去,自己看看效果——我肯定的告訴你,這些代碼運(yùn)行時(shí)正常的!
然而我也很不幸的告訴你:其實(shí)這段看起來整齊的代碼有一個(gè)巨大的安全隱患在里面,很大,很大的安全隱患,具體是啥,留到明天10點(diǎn)鐘準(zhǔn)時(shí)上線的《關(guān)于PHP動(dòng)態(tài)調(diào)用函數(shù)的安全問題》再說吧,你肯定不會(huì)把這一段代碼立馬用到服務(wù)器上吧?
另外經(jīng)過測試證實(shí),這個(gè)方法不但可以動(dòng)態(tài)調(diào)用函數(shù),并且也可以動(dòng)態(tài)實(shí)例化對象,像這樣:$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();//動(dòng)態(tài)調(diào)用,因?yàn)閚ew了對象
- A::foo();//靜態(tài)調(diào)用,直接用類名去調(diào)用,沒有new對象
- $b = new B();
- //開源代碼Vevb.com
- $b->bar();//在對象$b中,A::foo();進(jìn)行靜態(tài)調(diào)用
- B::bar();
- ?>
總結(jié):靜態(tài)、動(dòng)態(tài)調(diào)用都指類、對象對其方法的調(diào)用,動(dòng)態(tài)指的是創(chuàng)建(new)了對象,然后用對象變量去調(diào)用方法;靜態(tài)則是沒有創(chuàng)建對象,直接用類名去調(diào)用,至于另一個(gè)對象那就很簡單了,不同的類創(chuàng)建不同的對象,比如class A;class B ,$a = new A();$b = new B();$a and $b 相對之間就是另一個(gè)對象了.
新聞熱點(diǎn)
疑難解答