您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)怎么在php項目中實現(xiàn)動態(tài)調(diào)用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在程序中如果加一大堆判斷的確是一個很大的麻煩,例如這樣:
復(fù)制代碼 代碼如下:
if($fun='a'){echo "哎呀!";}
elesif(){}
……
else{echo "嗯!";}
真的很麻煩并且造成程序后期閱讀和修改時候的巨大麻煩,這時候我們可以把每一個要執(zhí)行的代碼段,用函數(shù)來實現(xiàn),然后可以用一個更加NB的方法來實現(xiàn)這些功能,并且因為每一個函數(shù)實現(xiàn)一個功能,我們維護起來就簡單多了.
進入正題,看看PHP動態(tài)調(diào)用函數(shù)到底有什么作用,在PHP中是可以動態(tài)調(diào)用函數(shù)的,像這樣$fun(),PHP解析器可以根據(jù)變量$fun的值來調(diào)用對用的函數(shù),例如$fun='a',解析器看到的將是a();這樣的形式,從而調(diào)用函數(shù)a,具體代碼如下:
復(fù)制代碼 代碼如下:
<?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)用!";
}
?>
實例代碼如下:
復(fù)制代碼 代碼如下:
<?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>";
}
?>
在前臺頁面我們可以用不同的鏈接來實現(xiàn)不同的功能,例如我們有這樣一個鏈接
http://localhost/controller.php?fun=a
當(dāng)請求到達controller.php的時候,PHP程序?qū)詣拥膱?zhí)行函數(shù)a().
問題的重點:
在于我們在這個程序的頁面首先調(diào)用了controller()函數(shù)。這個函數(shù)首先判斷參數(shù)中定義的函數(shù)名稱($fun的值)是否被定義,如果定義了就調(diào)用這個函數(shù)。
如果在$_GET參數(shù)中fun沒有定義:http://localhost/controller.php
就調(diào)用一個缺省的函數(shù)def();
這樣的代碼是不是簡潔很對呢?你可以把這些代碼拷貝回去,自己看看效果——我肯定的告訴你,這些代碼運行時正常的!
然而我也很不幸的告訴你:其實這段看起來整齊的代碼有一個巨大的安全隱患在里面,很大,很大的安全隱患,具體是啥,感興趣的朋友可以參考相關(guān)文檔,相信你肯定不會把這一段代碼立馬用到服務(wù)器上的?
另外經(jīng)過測試證實,這個方法不但可以動態(tài)調(diào)用函數(shù),并且也可以動態(tài)實例化對象,像這樣:
復(fù)制代碼 代碼如下:
$obj = new $obj();
代碼如下:
復(fù)制代碼 代碼如下:
<?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();//動態(tài)調(diào)用,因為new了對象
A::foo();//靜態(tài)調(diào)用,直接用類名去調(diào)用,沒有new對象
$b = new B();
$b->bar();//在對象$b中,A::foo();進行靜態(tài)調(diào)用
B::bar();
?>
總結(jié):靜態(tài)、動態(tài)調(diào)用都指類、對象對其方法的調(diào)用,動態(tài)指的是創(chuàng)建(new)了對象,然后用對象變量去調(diào)用方法;靜態(tài)則是沒有創(chuàng)建對象,直接用類名去調(diào)用,至于另一個對象那就很簡單了,不同的類創(chuàng)建不同的對象,比如class A;class B ,$a = new A();$b = new B();$a and $b 相對之間就是另一個對象了.
上述就是小編為大家分享的怎么在php項目中實現(xiàn)動態(tài)調(diào)用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。