PHP, использующий ‘use’ в анонимной функции, выдает исключение

Я работаю в последней версии PHP внутри класса и пишу функцию сортировки, которая включает в себя следующее:

public static function sort_alphabetically($data, $sortBy=null)
{
...

if($sortBy)
{
function sortBy($a, $b) use ($sortBy)
{
if ($a->$sortBy == $b->$sortBy){return 0;}
if ($a->$sortBy > $b->$sortBy){return 1;}
else{return -1;}
};

usort($data, "sortBy");
}
return $data;
}

пока я постоянно получаю

Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное использование (T_USE), ожидание ‘{‘ …

Трудно гуглить слово use и получить полезные результаты, но я видел упоминание о том, что его нельзя использовать в классе или пространстве имен. Тем не менее, документация PHP делает именно это — http://php.net/manual/en/functions.anonymous.php — поэтому я не уверен, был ли автор этого кусочка Интернета верным.

Может кто-нибудь пролить некоторый свет на это? Есть ли альтернативный метод, который я мог бы использовать?

1

Решение

use Ключевое слово (не единственный вариант использования) используется для импорта переменных в замыкания или анонимные функции (другие применения — импорт пространств имен или признаков).

Это не относится к обычным функциям, которые имеют имя (как в вашем случае). То, что вы сделали, это просто вложили функцию в другую функцию. Чтобы иметь возможность импортировать переменные в замыкание или анонимную функцию, вам нужно сначала объявить ее.

У вас есть следующие варианты:

public static function sort_alphabetically($data, $sortBy=null)
{
...

if($sortBy)
{
usort($data, function($a, $b) use ($sortBy){
if ($a->$sortBy == $b->$sortBy){return 0;}
if ($a->$sortBy > $b->$sortBy){return 1;}
else{return -1;}
});
}
return $data;
}

Здесь вы можете использовать закрытие и импортировать $sortBy Переменная в него.

public static function sort_alphabetically($data, $sortBy=null)
{
...

if($sortBy)
{
$callback = function($a, $b) use ($sortBy){
if ($a->$sortBy == $b->$sortBy){return 0;}
if ($a->$sortBy > $b->$sortBy){return 1;}
else{return -1;}
};

usort($data, $callback);
}
return $data;
}

В этом случае используется анонимная функция.

3

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

use Языковая конструкция действительна только для анонимных функций. Ваша функция не является анонимной, потому что вы дали ей имя.

public static function sort_alphabetically($data, $sortBy=null)
{
...

if($sortBy)
{
$f = function($a, $b) use ($sortBy)
{
if ($a->$sortBy == $b->$sortBy){return 0;}
if ($a->$sortBy > $b->$sortBy){return 1;}
else{return -1;}
};

usort($data, $f);
}
return $data;
}

Удалите имя, у вас должно быть все в порядке.

0

Вы не можете использовать use если это не анонимная функция или закрытие. Предполагая, что вы не используете эту функцию в другом месте, вы можете легко настроить свой код в соответствии с требованиями ниже. Точно так же вы можете назначить функцию переменной и использовать переменную в качестве второго аргумента usort

public static function sort_alphabetically($data, $sortBy=null)
{
if($sortBy)
{
usort($data, function ($a, $b) use ($sortBy)
{
if ($a->{$sortBy} == $b->{$sortBy}){return 0;}
if ($a->{$sortBy} > $b->{$sortBy}){return 1;}
else{return -1;}
});
}

return $data;
}
0

переместите функцию за пределы другой функции. Вложенные функции действительно трудно читать, особенно то, как вы используете имена в этой функции. это наиболее вероятно вызывает проблему компилятора.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector