Почему не получается передать в качестве аргумента функцию из другого пространства имен по его алиасу?

Доброй ночи.
Имеется код следующего вида:
namespace Roots\Sage\Extras;

use Roots\Sage\Config;
use Roots\Sage\NavWalkers;
use Roots\Sage\Utils;

function crop_classes($classes) {
    return array_filter($classes, 'Utils\\is_element_empty'); // Здесь ошибка 'function not found'
}


Мне надо добиться передачи в array_filter функции из пространства имен наиболее красивым способом. Все пространства имен 100% верные, т.к. если написать полный путь, все будет работать.
return array_filter($classes, 'Roots\\Sage\\Utils\\is_element_empty'); // Все работает


Почему так происходит, и можно ли все-таки использовать алиас вместо полного пути?

Спасибо.
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
array_filter из глобального неймспейса. Она понятия не имеет, где ее вызывают, тем более, какие из неймспейсов подключены через use, посему - нет.

По хорошему передача функции по имени - не самая лучшая идея, ошибки вы обнаружите уже в момент выполнения.

Лучше писать примерно так:

return array_filter(
    $classes,
    function ($value) {
        return Roots\Sage\Utils\is_element_empty($value);
    }
);


Конкретно случай is_element_empty не имеет смысла так как array_filter это делает по умолчанию. Кроме того вы жестко нарушаете PSR, что тоже очень плохо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы