Как ссылаться на функцию внутри функции 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?

0

Решение

Ваша функция находится в другой функции, вместо этого попробуйте объявить вашу функцию в классе

например :

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

Другие решения

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
...
}
}

Или используйте анонимная функция:

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

Когда вызывается метод «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) {
// ...
});
0
По вопросам рекламы [email protected]