2014-09-24 21 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) { 
    // ... 
});