《PHP實(shí)例:php中的動(dòng)態(tài)調(diào)用實(shí)例分析》要點(diǎn):
本文介紹了PHP實(shí)例:php中的動(dòng)態(tài)調(diào)用實(shí)例分析,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
本文實(shí)例講述了php中的動(dòng)態(tài)調(diào)用具體用法.分享給大家供大家參考.具體分析如下:PHP編程
在程序中如果加一大堆判斷的確是一個(gè)很大的麻煩,例如這樣:
PHP編程
代碼如下:
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ù)起來就簡(jiǎn)單多了.
進(jìn)入正題,看看PHP動(dòng)態(tài)調(diào)用函數(shù)到底有什么作用,在PHP中是可以動(dòng)態(tài)調(diào)用函數(shù)的,像這樣$fun(),PHP解析器可以根據(jù)變量$fun的值來調(diào)用對(duì)用的函數(shù),例如$fun='a',解析器看到的將是a();這樣的形式,從而調(diào)用函數(shù)a,具體代碼如下:
PHP編程
代碼如下:
<?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 "函數(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=aPHP編程
當(dāng)哀求到達(dá)controller.php的時(shí)候,PHP程序?qū)?huì)自動(dòng)的執(zhí)行函數(shù)a().PHP編程
問題的重點(diǎn):PHP編程
在于我們?cè)谶@個(gè)程序的頁面首先調(diào)用了controller()函數(shù).這個(gè)函數(shù)首先判斷參數(shù)中定義的函數(shù)名稱($fun的值)是否被定義,如果定義了就調(diào)用這個(gè)函數(shù).PHP編程
如果在$_GET參數(shù)中fun沒有定義:http://localhost/controller.phpPHP編程
就調(diào)用一個(gè)缺省的函數(shù)def();PHP編程
這樣的代碼是不是簡(jiǎn)潔很對(duì)呢?你可以把這些代碼拷貝回去,自己看看效果――我肯定的告訴你,這些代碼運(yùn)行時(shí)正常的!PHP編程
然而我也很不幸的告訴你:其實(shí)這段看起來整齊的代碼有一個(gè)巨大的平安隱患在里面,很大,很大的平安隱患,具體是啥,感興趣的朋友可以參考相關(guān)文檔,相信你肯定不會(huì)把這一段代碼立馬用到服務(wù)器上的?PHP編程
另外經(jīng)過測(cè)試證實(shí),這個(gè)辦法不但可以動(dòng)態(tài)調(diào)用函數(shù),并且也可以動(dòng)態(tài)實(shí)例化對(duì)象,像這樣: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();//動(dòng)態(tài)調(diào)用,因?yàn)閚ew了對(duì)象
A::foo();//靜態(tài)調(diào)用,直接用類名去調(diào)用,沒有new對(duì)象
$b = new B();
$b->bar();//在對(duì)象$b中,A::foo();進(jìn)行靜態(tài)調(diào)用
B::bar();
?>
總結(jié):靜態(tài)、動(dòng)態(tài)調(diào)用都指類、對(duì)象對(duì)其辦法的調(diào)用,動(dòng)態(tài)指的是創(chuàng)建(new)了對(duì)象,然后用對(duì)象變量去調(diào)用辦法;靜態(tài)則是沒有創(chuàng)建對(duì)象,直接用類名去調(diào)用,至于另一個(gè)對(duì)象那就很簡(jiǎn)單了,不同的類創(chuàng)建不同的對(duì)象,比如class A;class B ,$a = new A();$b = new B();$a and $b 相對(duì)之間就是另一個(gè)對(duì)象了.
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助.PHP編程
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP實(shí)例:php中的動(dòng)態(tài)調(diào)用實(shí)例分析》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/12804.html