2014-09-24 51 views
0

我想調用一個函數使用usort,但是我得到一個錯誤,該類沒有方法。如何引用函數內的函數usort

$awards = usort ($q->posts, array($this, '_mt_latest_award_sort')); 

的設置是目前

namespace Test\Theme 
class Shortcodes extends Theme 
{ 
     ... 
     //this is the function I am trying to call on 
     function _mt_latest_award_sort($value1, $value2) 
     { 
      ... 
      //code to do the sorting 
      ... 
     } 
     ... 
     $awards = usort ($q->posts, array($this, '_mt_latest_award_sort'); 
     ... 
    } 

當我改變usort參考我的「獎項」功能

$awards = usort ($q->posts, array($this, 'awards')); 

它拋出回一個錯誤,公衆大獎函數內我的功能已經被宣佈。

如何正確指向_mt_latest_award_sort函數?

+2

您有沒有出現在你的代碼發佈'_mt_latest_award_sort'功能。你的意思是'_mt_latest_award'? – h2ooooooo 2014-09-24 22:42:13

+0

如果你希望你可以把它變成一個類的函數(就像'awards()'一樣),或者你可以把函數聲明放在'if(!function_exists('_ mt_latest_award_sort')){}'語句中。 – h2ooooooo 2014-09-24 22:53:49

回答

1

你的功能是在其它功能,試圖聲明你的函數的類,而不是

例如:

class C 
{ 
    public function Fa() 
    { 
     function Fc() 
     { 
      ... 
     } 
     ... 
     $this->Fb(); // it works C::Fb is a function 
     $this->Fc(); // it doesn't work, there is no C::Fc function 
     ... 
    } 

    function Fb() 
    { 
     ... 
    } 
} 
0

PHP不支持嵌套函數。

這是一個常見的錯誤/誤解,因爲下面的代碼似乎工作:

function foo() { 
    function bar() { 
     echo 'Hello!'; 
    } 
    bar(); 
    bar(); 
    bar(); 
} 

然而,這實際上沒有定義一個嵌套函數,它只是定義一個全局函數bar每當運行foo()。您可以通過運行foo()兩次進行測試 - 第一次,將定義function bar,然後運行3次;第二次,你會得到一個致命的錯誤,因爲你試圖定義兩次相同的函數。

要麼你需要定義你的函數作爲類的一個單獨的方法:

class Shortcodes extends Theme 
{ 
    public function awards() 
    { 
     ... 
     $awards = usort($q->posts, array($this, '_mt_latest_award_sort')); 
     ... 
    } 

    private function _mt_latest_award_sort($value1, $value2) 
    { 
     ... 
     //code to do the sorting 
     ... 
    } 
} 

或者使用一個anonymous function

class Shortcodes extends Theme 
{ 
    public function awards() 
    { 
     ... 
     $awards = usort ($q->posts, function($value1, $value2) 
     { 
      ... 
      //code to do the sorting 
      ... 
     }); 
     ... 
    } 
} 
+0

謝謝,把這個功能轉移到一個單獨的班級工作方法中。 – emily 2014-09-25 18:20:03

0

當方法「獎」之稱,有一個嘗試聲明函數「_mt_latest_award_sort」。

隨着$awards = usort ($q->posts, array($this, '_mt_latest_award_sort');實施,這也將無法以同樣的方式:

$shortcode = new Shorcodes; 
$shortcode->awards(); // "_mt_latest_award_sort" is declared 
$shortcode->awards(); // attempted to redeclare "_mt_latest_award_sort" 

僅僅因爲你聲明的另一個函數內部命名函數,這並不意味着它的範圍不是全局。

這應該解決您的問題:

class Shortcodes extends Theme 
{ 
    private $posts = array(); 

    // ... 

    private function _mt_latest_award_sort($value1, $value2) { 
     // ... 
    } 

    public function awards() 
    { 
     // ... 
     $awards = usort($this->posts, array($this, '_mt_latest_award_sort')); 
     // ... 
    } 
} 

你也可以使用匿名函數:

$awards = usort($this->posts, function($value1, $value2) { 
    // ... 
});