国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

php中動(dòng)態(tài)調(diào)用說明

2024-05-04 21:48:45
字體:
供稿:網(wǎng)友

動(dòng)態(tài)調(diào)用在php算是高級的東西了,今天我們來看看這高級的活是什么吧,先來分析一下判斷什么是這個(gè)動(dòng)態(tài)調(diào)用,有需要的朋友看看吧.

在程序中如果加一大堆判斷的確是一個(gè)很大的麻煩,例如這樣:

  1. if($fun=’a’){echo ”哎呀!”;} 
  2. elesif(){} 
  3. …… 
  4. 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,具體代碼如下:

  1. <?php 
  2. //程序來源:PHP iask http://m.survivalescaperooms.com 
  3. //controller.php 
  4. (isset($_GET['fun'])&&$_GET['fun']!='')?$fun=$_GET['fun']:$fun='def'
  5.  
  6. controller($fun); 
  7.  
  8. function controller($fun){ 
  9.      if(function_exists($fun)) $fun(); 
  10.      else echo "函數(shù){$fun}未定義"
  11.  
  12. function def(){ 
  13.      echo "由于用戶沒有傳遞參數(shù),調(diào)用了缺省的函數(shù)def()"
  14. function a(){ 
  15.     echo "函數(shù)a被調(diào)用!"
  16. function b(){ 
  17.     echo "函數(shù)b被調(diào)用!"
  18. ?> 

實(shí)例代碼如下:

  1. <?php 
  2.  require_once showErrMsg.php; 
  3.  $_action = (isset($_REQUEST[action])?$_REQUEST[action]:""); 
  4.  if($_action!=null&&$_action!=){ 
  5.   if(function_exists($_action)){ 
  6.    eval("$_action();"); 
  7.   }else
  8.    die(showErrMsg ( "<br>當(dāng)前php文件中不存在方法[<b>".$_action."()</b>]。")); 
  9.   } 
  10.  } 
  11. ?> 
  12.  
  13. <?php 
  14. function showErrMsg($strMsg){ 
  15.   return "<font color=red>".$strMsg."</font>"
  16.  } 
  17. ?> 

在前臺(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();代碼如下:

  1. <?php 
  2. class A 
  3.       function foo() 
  4.       { 
  5.           if (isset($this)) { 
  6.               echo '$this is defined ('
  7.               echo get_class($this); 
  8.               echo ")n"
  9.           } else { 
  10.               echo "$this is not defined.n"
  11.           } 
  12.       } 
  13.  
  14. class B 
  15.       function bar() 
  16.       { 
  17.         A::foo(); 
  18.          //parent::foo(); 
  19.       } 
  20.  
  21. $a = new A(); 
  22. $a->foo();//動(dòng)態(tài)調(diào)用,因?yàn)閚ew了對象 
  23. A::foo();//靜態(tài)調(diào)用,直接用類名去調(diào)用,沒有new對象 
  24. $b = new B(); 
  25. //開源代碼Vevb.com 
  26. $b->bar();//在對象$b中,A::foo();進(jìn)行靜態(tài)調(diào)用 
  27. B::bar(); 
  28. ?> 

總結(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è)對象了.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桑植县| 平塘县| 荣成市| 博爱县| 崇文区| 新龙县| 太保市| 万荣县| 宕昌县| 齐齐哈尔市| 霸州市| 澄迈县| 屏东县| 乌鲁木齐县| 邯郸县| 宁海县| 汝州市| 沙雅县| 深泽县| 荣成市| 石台县| 泰兴市| 阜新市| 杭州市| 石棉县| 定南县| 榆树市| 清丰县| 赤峰市| 岳阳县| 太保市| 河曲县| 平湖市| 缙云县| 图木舒克市| 高雄县| 陕西省| 安顺市| 平武县| 连城县| 根河市|