2013-02-08 55 views
2

我有一个函数重新声明问题。所以,我想多次调用这个例子。PHP类函数声明问题

class myClass { 

    function abc() { 

     function internal() { 

     return "i am internal"; 
     } 

    return internal(); 
    } 

} 


$myClass = new myClass(); 

echo $myClass->abc(); 
echo $myClass->abc(); // HERE IS THE PROBLEM when i call same function second time 

PHP显示致命错误:不能重新声明内()(先前声明)。

有没有人有一个想法我该如何解决这个问题?

在此先感谢。

+2

不要在其他函数中定义函数,这是不需要的。 – 2013-02-08 15:23:45

+1

不能嵌套函数定义 - 有没有必要做了,它会导致这样的问题,而且是一个坏的代码味道 – 2013-02-08 15:24:47

+0

你打我给它 – Dave 2013-02-08 15:24:51

回答

1

当你声明使用function <name>()的功能,你是不是你以为你是范围宣布它。该函数在 全局作用域中声明,而不是函数/类作用域。

查看PHP文档:http://www.php.net/manual/en/functions.user-defined.php#example-149

所以,当你调用abc,您要重新声明全局函数,internal

如果你想要做你在做什么,你可以使用closures代替(注:在PHP这只能5.3+)。这有利于能够从abc(如果使用use关键字)读取局部变量。

class myClass { 

    function abc() { 
     $internal = function() { 
      return "i am internal"; 
     }; 

     return $internal(); 
    } 
} 

还可以声明internal作为类的私有函数,尤其是如果它不会改变。为什么要重新制作一个功能?

class myClass { 

    private function internal(){ 
     return "i am internal"; 
    } 

    function abc() { 
     return $this->internal(); 
    } 
} 
+0

哇,非常好的解决方案! – 2013-02-08 15:58:08

+0

不客气!很高兴我能帮上忙 :-) – 2013-02-08 16:00:43

5

你不能重新声明函数周期,从而尝试是这样的:

<?php 
class myClass { 

    function abc() { 
     return $this->internal(); 
    } 

    private function internal() { 
     return "i am internal"; 
    } 

} 
?> 
+0

好的,谢谢你的队友! – 2013-02-08 15:42:03

0

或者:

if (!function_exists('internal')) { function internal ... } 

但是,你要知道,在这种情况下,函数内部将可以外也是类范围。劳伦斯的解决方案是一个更好的方法。

1

检查是否之前定义它的功能存在:

class myClass { 
    function abc() { 
     if (! function_exists('internal')) { 
      function internal() { 
       return "i am internal"; 
      } 
     } 

     return internal(); 
    } 
}