如何在函数usort中引用函数


How to reference a function within a function 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');
    // ...
}

当我改变CCD_ 2以引用我的";奖励";功能

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

它返回了一个错误,即我在publicawards函数中的函数已经声明。

如何正确指向_mt_latest_award_sort函数?

您的函数在另一个函数中,请尝试在类中声明您的函数,而不是

例如:

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()
    {
        ...
    }
}

PHP不支持嵌套函数。

这是一个常见的错误/误解,因为下面的代码似乎有效:

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

然而,这实际上并不是定义嵌套函数,它只是在运行foo()时定义全局函数bar。您可以通过运行两次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 
        ...
    }
}

或者,使用匿名函数:

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

当调用方法"awards"时,会尝试声明函数"_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) {
    // ...
});