Я работаю в последней версии 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 — поэтому я не уверен, был ли автор этого кусочка Интернета верным.
Может кто-нибудь пролить некоторый свет на это? Есть ли альтернативный метод, который я мог бы использовать?
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;
}
В этом случае используется анонимная функция.
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;
}
Удалите имя, у вас должно быть все в порядке.
Вы не можете использовать 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;
}
переместите функцию за пределы другой функции. Вложенные функции действительно трудно читать, особенно то, как вы используете имена в этой функции. это наиболее вероятно вызывает проблему компилятора.