如何引用函数usort中的函数

时间:2014-09-24 22:38:04

标签: php 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');
        ...
    }

当我改变引用我的"奖励"功能

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

它抛出了一个错误,即公共奖励函数中的函数已经被声明。

如何正确指向_mt_latest_award_sort函数?

3 个答案:

答案 0 :(得分: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()
    {
        ...
    }
}

答案 1 :(得分: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 
            ...
        });
        ...
    }
}

答案 2 :(得分: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) {
    // ...
});