2012-07-26 53 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); 

玩得开心。