2012-07-26 52 views
0

我有以下的PHP代碼內聲明的函數:腳本死與另一個功能

function mapWordsToOriginal() 
    { 
    try 
    { 
     $d = array(); 
     function map_FilteredWithOriginal($n, $m) 
     { 
      return(array(($n + 1) => ($m + 1))); 
     } 
     foreach ($this->wordsArray as $word) 
     { 

      array_push($d, array_map(
          "map_FilteredWithOriginal", 
          array_keys(
           $this->wordsArray, $word), 
          array_keys($this->originalText, $word))); 
     } 

     for ($i = 0; $i < count($d); $i++) 
     { 
      for ($j = 0; $j < count($d[$i]); $j++) 
      { 
       $this->mapFilteredWithOriginal +=$d[$i][$j]; 
      } 
     } 

     if ($this->debug) 
     { 
      print_r($this->mapFilteredWithOriginal); 
     } 
    } 
    catch (Exception $e) 
    { 

     echo 'Caught exception: ', $e->getMessage(), "\n"; 
    } 
} 

我使用此功能幾次(取決於有多長文本),但是當我得到這個代碼中第二次:

function map_FilteredWithOriginal($n, $m) 
    { 
     return(array(($n + 1) => ($m + 1))); 
    } 

該腳本剛剛停止。

我不知道爲什麼,沒有異常被逮住....

+4

出於好奇,你爲什麼要在方法中聲明一個方法? – Matt 2012-07-26 19:41:47

+1

打開錯誤報告。並非一切都會在PHP中引發異常! (實際上大多數問題不會),而是尋找致命的錯誤。 – 2012-07-26 19:41:52

+0

[This may help](http://stackoverflow.com/questions/708341/can-i-include-a-function-inside-of-another-function-php)。 – 2012-07-26 19:43:22

回答

2

您應該在函數聲明的基礎上添加一個function_exists() === false條件,以便在第二次傳遞時不會再聲明它。對於它的價值,你可能通常不應該以嵌套的方式聲明函數,除非你真的打算有條件地聲明函數(即使用函數來有條件地創建一個函數)。

在這種情況下,您應該在主函數之外移動嵌套函數。

+0

如果我將它移到外面,該代碼將如何識別它? array_push($ d,array_map(「map_FilteredWithOriginal」,array_keys($ this-> wordsArray,$ word),array_keys($ this-> originalText,$ word))); 它使用的方法名稱,如果它的外面它不會識別它... – 2012-07-26 19:50:36

+0

PHP解析器在執行之前解析所有函數聲明。只要函數聲明在執行路徑中包含的一組文件中的某處。所以它可能位於腳本的底部並在腳本的頂部被引用,並且仍然有效。 – 2012-07-26 19:52:29

+0

好的,我會嘗試。謝謝! – 2012-07-26 19:53:26

0

你可能會得到一個錯誤,因爲在第二次調用mapWordsToOriginal你會被重新聲明map_FilteredWithOriginal

在這種情況下,沒有必要在函數內部定義一個函數,因爲它不會限制範圍,並且使得它的可讀性降低。

如果你必須這樣定義它,你可以使用PHP的function_exists函數來只聲明map_FilteredWithOriginal一次。

0

你不能在那裏發現異常。

你的代碼通過調用mapWordsToOriginal()不止一次產生致命錯誤因爲重新聲明map_FilteredWithOriginal()的。

if (FALSE === function_exists('map_FilteredWithOriginal')) 
{ 
    function map_FilteredWithOriginal($n, $m) 
    { 
     return(array(($n + 1) => ($m + 1))); 
    } 
} 

這會幫助我想。

嘗試在您的項目中使用error_reporting()開發時間只有),這使得調試更容易。 :)

error_reporting(E_ALL | E_STRICT); 

玩得開心。