2013-02-08 94 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(); 
    } 
}