Я пытаюсь вызвать функцию, используя 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?
Ваша функция находится в другой функции, вместо этого попробуйте объявить вашу функцию в классе
например :
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();
}
Тем не менее, это на самом деле не определение вложенной функции, это просто определение глобальной функции 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
...
});
...
}
}
Когда вызывается метод «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) {
// ...
});