За последние 24 часа нас посетили 22588 программистов и 1278 роботов. Сейчас ищут 749 программистов ...

Как ведёт себя pathinfo() на разных системах?

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 3 апр 2022.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    В доках по basename() явно прописано, что на винде она будет работать и с прямым и с обратным слешами, на других системах - с прямым, то есть на Linux получить, например, последний сегмент неймспейса без дополнительной конвертации слешей не получится.

    А как pathinfo() ведёт себя в таких случаях? В доках нет таких пояснений, я руками потестил, похоже такое же поведение, но нужна конкретность, кто поделится опытом?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    так же как и const DIRECTORY_SEPARATOR
     
    Вероломство нравится это.
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    бро, на линях функция pathinfo() мне возвращает a\a\a вместо a :(
    --- Добавлено ---
    @MouseZver я так понимаю, ты мне намекнул, что если я константу буду юзать, то она её отработает, ну я так тоже умею шутить
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Странный вывод.
    Приведите пример разбора такой строки, который, предположительно, не будет работать на Linux как заявлено в документации.
    И какой именно сегмент в примере невозвращаем.
     
  5. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    лови

    PHP:
    1.     pathinfo('a\a\a.php', PATHINFO_FILENAME), // 'a\a\a'
    2.     pathinfo('a/a/a.php', PATHINFO_FILENAME), // a
    3.     basename('a\a\a.php', '.php'), // 'a\a\a'
    4.     basename('a/a/a.php', '.php'), // a
    5.     pathinfo(App::class, PATHINFO_FILENAME), // core\App
    6.     pathinfo(strtr(App::class, '\\', DIRECTORY_SEPARATOR), PATHINFO_FILENAME), // App
    7.     basename(App::class), // core\App
    8.     basename(strtr(App::class, '\\', DIRECTORY_SEPARATOR)) // App
    9. );
    Linux

    я вижу что pathinfo работает так же как и basename, обратные слеши на линях не будут бработаны без дополнительной конвертации

    ПРАВИЛЬНО?
     
    #5 Вероломство, 4 апр 2022
    Последнее редактирование: 4 апр 2022
  6. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Нет.
    Это легко проверить. Любую песочницу открываем и проверяем.
    Проблема может возникнуть, если слэши в какой-то экзотической кодировке. Без указания локали
     
  7. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    очки протри, песочница

    PHP:
    1.     pathinfo('a\a\a.php', PATHINFO_FILENAME), // 'a\a\a'
    2.     pathinfo('a/a/a.php', PATHINFO_FILENAME), // a
    3.     basename('a\a\a.php', '.php'), // 'a\a\a'
    4.     basename('a/a/a.php', '.php'), // a
    5.     pathinfo(App::class, PATHINFO_FILENAME), // core\App
    6.     pathinfo(strtr(App::class, '\\', DIRECTORY_SEPARATOR), PATHINFO_FILENAME), // App
    7.     basename(App::class), // core\App
    8.     basename(strtr(App::class, '\\', DIRECTORY_SEPARATOR)) // App
    9. );
     
  8. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Не в моих очках дело.
    Разбирается строка, а не путь к реальному файлу.
     
    #8 Drunkenmunky, 5 апр 2022
    Последнее редактирование: 5 апр 2022
  9. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ну я строки разбираю, не разбирается, значит я делаю вывод: pathinfo() работает со слешами так же как и basename()
     
  10. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Поспешный.
    Обратный слеш в одинарных кавычках не то же самое, что в двойных.
    И Linux здесь совсем не при чем.
     
  11. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    PHP:
    1. var_dump('\\', "\\"); // string '\' (length=1) string '\' (length=1)
    не вижу разницы

    Какой ответ на вопрос?
     
  12. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    "Конвертировать"(заменять \ на /) нужно в любом случае,. Чтобы не попасть впросак, как вы в коде выше.
    В частности комбинация \a используется для вывода спецсимвола BEL
     
    artoodetoo нравится это.
  13. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    мне это не надо, у меня нет вывода спецсимволов

    там нет расстояния от полового органа до анального отверстия, там результаты работы функций PHP

    ок, будем считать, что вопрос решён

    PHP:
    1. private static function getArray()
    2. {
    3.     return self::$array ??= array_merge_recursive(...array_map(function ($file) {
    4.         $array = include $file;
    5.  
    6.         if (is_array($array)) {
    7.             return [pathinfo($file, PATHINFO_FILENAME) => $array];
    8.         }
    9.  
    10.         throw new Exception("Не найден массив конфигурации файла: $file");
    11.     }, glob(strtr('config/*.php', '/', DIRECTORY_SEPARATOR))));
    12. }
     
    #13 Вероломство, 5 апр 2022
    Последнее редактирование: 5 апр 2022
  14. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @Drunkenmunky даже вот так

    PHP:
    1. private static function getArray()
    2. {
    3.     return self::$array ??= array_merge_recursive(...array_map(function ($file) {
    4.         $array = include $file;
    5.  
    6.         if (is_array($array)) {
    7.             return [basename($file, '.php') => $array];
    8.         }
    9.  
    10.         throw new Exception("Не найден массив конфигурации файла: $file");
    11.     }, glob(strtr(getcwd() . '/config/*.php', '\\', '/'))));
    12. }
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Когда исходит любой "Глагол" от твоего творения - это означает частичное / неполное выполнение поставленных собою задач.


    Один момент:
    PHP:
    1. <?php
    2.     pathinfo('a\a\a.php', PATHINFO_FILENAME), // 'a\a\a'
    3.     pathinfo('a/a/a.php', PATHINFO_FILENAME), // a
    4.     basename('a\a\a.php', '.php'), // 'a\a\a'
    5.     basename('a/a/a.php', '.php'), // a
    6.     pathinfo(App::class, PATHINFO_FILENAME), // core\App
    7.     pathinfo(strtr(\t1\App::class, '\\', DIRECTORY_SEPARATOR), PATHINFO_FILENAME), // App
    8.     basename(App::class), // core\App
    9.     basename(strtr(\t2\App::class, '\\', DIRECTORY_SEPARATOR)) // App
    10. );
    Linux
    PHP:
    1. string(5) "a\a\a"
    2. string(1) "a"
    3. string(5) "a\a\a"
    4. string(1) "a"
    5. string(3) "App"
    6. string(3) "App"
    7. string(3) "App"
    8. string(3) "App"
    Windows
    PHP:
    1. string(1) "a"
    2. string(1) "a"
    3. string(1) "a"
    4. string(1) "a"
    5. string(3) "App"
    6. string(3) "App"
    7. string(3) "App"
    8. string(3) "App"
    То что ты не понимаешь как работает basename, это никому не интересно.
    Юзай realpath если тебя так пугают слэши.


    Пи3дец.

    Разница в другом. Когда имя чего-либо будет начинаться c 0,a,b,t,n,v,f,r и т.д. после экранирующего слэша, и это все в двойных кавычках. У тебя будут проблемы.
     
    Вероломство нравится это.
  16. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    :) ну там если в getcwd() будут обратные слеши, то strtr их конвертнёт в прямые, а basename в любом случает отработает с прямыми :p

    нормально же всё, но я не так сделал, я сделал вот так

    PHP:
    1. private static function getArray()
    2. {
    3.     return self::$array ??= array_merge_recursive(...array_map(function ($file) {
    4.         $array = include $file;
    5.  
    6.         if (is_array($array)) {
    7.             return [basename($file, '.php') => $array];
    8.         }
    9.  
    10.         throw new Exception("Не найден массив конфигурации файла: $file");
    11.     }, glob('config/*.php')));
    12. }
    и забыли