В доках по basename() явно прописано, что на винде она будет работать и с прямым и с обратным слешами, на других системах - с прямым, то есть на Linux получить, например, последний сегмент неймспейса без дополнительной конвертации слешей не получится. А как pathinfo() ведёт себя в таких случаях? В доках нет таких пояснений, я руками потестил, похоже такое же поведение, но нужна конкретность, кто поделится опытом?
бро, на линях функция pathinfo() мне возвращает a\a\a вместо a --- Добавлено --- @MouseZver я так понимаю, ты мне намекнул, что если я константу буду юзать, то она её отработает, ну я так тоже умею шутить
Странный вывод. Приведите пример разбора такой строки, который, предположительно, не будет работать на Linux как заявлено в документации. И какой именно сегмент в примере невозвращаем.
лови PHP: var_dump( pathinfo('a\a\a.php', PATHINFO_FILENAME), // 'a\a\a' pathinfo('a/a/a.php', PATHINFO_FILENAME), // a basename('a\a\a.php', '.php'), // 'a\a\a' basename('a/a/a.php', '.php'), // a pathinfo(App::class, PATHINFO_FILENAME), // core\App pathinfo(strtr(App::class, '\\', DIRECTORY_SEPARATOR), PATHINFO_FILENAME), // App basename(App::class), // core\App basename(strtr(App::class, '\\', DIRECTORY_SEPARATOR)) // App ); Linux я вижу что pathinfo работает так же как и basename, обратные слеши на линях не будут бработаны без дополнительной конвертации ПРАВИЛЬНО?
Нет. Это легко проверить. Любую песочницу открываем и проверяем. Проблема может возникнуть, если слэши в какой-то экзотической кодировке. Без указания локали
очки протри, песочница PHP: var_dump( pathinfo('a\a\a.php', PATHINFO_FILENAME), // 'a\a\a' pathinfo('a/a/a.php', PATHINFO_FILENAME), // a basename('a\a\a.php', '.php'), // 'a\a\a' basename('a/a/a.php', '.php'), // a pathinfo(App::class, PATHINFO_FILENAME), // core\App pathinfo(strtr(App::class, '\\', DIRECTORY_SEPARATOR), PATHINFO_FILENAME), // App basename(App::class), // core\App basename(strtr(App::class, '\\', DIRECTORY_SEPARATOR)) // App );
ну я строки разбираю, не разбирается, значит я делаю вывод: pathinfo() работает со слешами так же как и basename()
Поспешный. Обратный слеш в одинарных кавычках не то же самое, что в двойных. И Linux здесь совсем не при чем.
PHP: var_dump('\\', "\\"); // string '\' (length=1) string '\' (length=1) не вижу разницы Какой ответ на вопрос?
"Конвертировать"(заменять \ на /) нужно в любом случае,. Чтобы не попасть впросак, как вы в коде выше. В частности комбинация \a используется для вывода спецсимвола BEL
мне это не надо, у меня нет вывода спецсимволов там нет расстояния от полового органа до анального отверстия, там результаты работы функций PHP ок, будем считать, что вопрос решён PHP: private static function getArray() { return self::$array ??= array_merge_recursive(...array_map(function ($file) { $array = include $file; if (is_array($array)) { return [pathinfo($file, PATHINFO_FILENAME) => $array]; } throw new Exception("Не найден массив конфигурации файла: $file"); }, glob(strtr('config/*.php', '/', DIRECTORY_SEPARATOR)))); }
@Drunkenmunky даже вот так PHP: private static function getArray() { return self::$array ??= array_merge_recursive(...array_map(function ($file) { $array = include $file; if (is_array($array)) { return [basename($file, '.php') => $array]; } throw new Exception("Не найден массив конфигурации файла: $file"); }, glob(strtr(getcwd() . '/config/*.php', '\\', '/')))); }
Когда исходит любой "Глагол" от твоего творения - это означает частичное / неполное выполнение поставленных собою задач. Один момент: PHP: <?php var_dump( pathinfo('a\a\a.php', PATHINFO_FILENAME), // 'a\a\a' pathinfo('a/a/a.php', PATHINFO_FILENAME), // a basename('a\a\a.php', '.php'), // 'a\a\a' basename('a/a/a.php', '.php'), // a pathinfo(App::class, PATHINFO_FILENAME), // core\App pathinfo(strtr(\t1\App::class, '\\', DIRECTORY_SEPARATOR), PATHINFO_FILENAME), // App basename(App::class), // core\App basename(strtr(\t2\App::class, '\\', DIRECTORY_SEPARATOR)) // App ); Linux PHP: string(5) "a\a\a" string(1) "a" string(5) "a\a\a" string(1) "a" string(3) "App" string(3) "App" string(3) "App" string(3) "App" Windows PHP: string(1) "a" string(1) "a" string(1) "a" string(1) "a" string(3) "App" string(3) "App" string(3) "App" string(3) "App" То что ты не понимаешь как работает basename, это никому не интересно. Юзай realpath если тебя так пугают слэши. Пи3дец. Разница в другом. Когда имя чего-либо будет начинаться c 0,a,b,t,n,v,f,r и т.д. после экранирующего слэша, и это все в двойных кавычках. У тебя будут проблемы.
ну там если в getcwd() будут обратные слеши, то strtr их конвертнёт в прямые, а basename в любом случает отработает с прямыми нормально же всё, но я не так сделал, я сделал вот так PHP: private static function getArray() { return self::$array ??= array_merge_recursive(...array_map(function ($file) { $array = include $file; if (is_array($array)) { return [basename($file, '.php') => $array]; } throw new Exception("Не найден массив конфигурации файла: $file"); }, glob('config/*.php'))); } и забыли