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

Доброй ночи.
Имеется код следующего вида:
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, что тоже очень плохо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы