Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
1

Почему не работает относительный путь в glob?

13.10.2021, 08:33. Показов 2358. Ответов 8
Метки php8 (Все метки)

Author24 — интернет-сервис помощи студентам
В доках не нашёл какие-то противопоказания к применению относительных путей, поэтому:

PHP
1
2
3
glob(__DIR__ . '/dir/*.php'); // работает
 
glob('dir/*.php'); // не работает
Кто-то может пояснит?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2021, 08:33
Ответы с готовыми решениями:

Записать в массив относительный путь с именем файла из папки(не зная полный путь папки)
Наверняка вопрос заезженный, но я не нашел(плохо искал) Нужно из вложенной папки, из директории,...

функця glob(), почему в мануале нет описаня знака * (звездочка)
приветствую читал о функцие glob() например: $a = glob("papka/*.PNG"); там * означает что...

относительный путь к БД
как указать относительный путь к базе данных в C++ Builder 2009 ?

относительный путь
Как получить относительный путь моего проекта ? и как получить относительный путь для папки...

8
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
13.10.2021, 11:09 2
Лучший ответ Сообщение было отмечено DefenseMinister как решение

Решение

Выполните этот код:
PHP
1
var_dump(getcwd());
и увидите имя текущего рабочего каталога.

Рабочим каталогом служит не папка, содержащая файл со скриптом с glob, а папка, из которой скрипт запускается (это случается при использовании include, например).
1
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
13.10.2021, 11:21  [ТС] 3
Цитата Сообщение от Para bellum Посмотреть сообщение
из которой скрипт запускается (это случается при использовании include, например)
благодарю за дополнение про include, именно так и происходит: glob() находится в подключаемом файле

порешали

Добавлено через 8 минут
Para bellum, но всё-равно кое-какие сомнения у меня

есть папка - app/views/layouts/Default

в ней 3 файла: header.php, main.php, footer.php

в файле main.php подключаются относительно: include 'header.php' и include 'footer.php'

В чём отличие от того, как при применении glob()?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
13.10.2021, 11:29 4
Лучший ответ Сообщение было отмечено DefenseMinister как решение

Решение

А вот:
Файлы включаются исходя из пути указанного файла, или, если путь не указан, используется путь, указанный в директиве include_path. Если файл не найден в include_path, include попытается проверить директорию, в которой находится текущий включающий скрипт и текущую рабочую директорию перед тем, как выдать ошибку.
https://www.php.net/manual/ru/function.include.php
1
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
13.10.2021, 12:05  [ТС] 5
Para bellum, типа раз main.php уже подключили по пути app/views/layouts/Default, то внутри main.php подключения производятся относительно app/views/layouts/Default/main.php?

Para bellum, ты мне на пальцах поясни

вот структура

config
- autoload
- container.php
public
index.php

PHP
1
2
3
4
5
6
7
8
9
10
// index.php
 
chdir('..');
spl_autoload_register();
 
$container = include 'config/container.php';
 
// config/container.php
 
return new Container(array_merge_recursive(...array_map(fn($file) => include $file, glob(__DIR__ . '/autoload/*.php'))));
Почему include ... (fn($file) => include $file) ... НЕ попытается проверить директорию, в которой находится текущий включающий скрипт и ему требуется __DIR__?

Добавлено через 6 минут
Para bellum, короче я просто не могу связать в логическое объяснение данной ситуации, хотя в бошке вроде как всё на месте после пояснения о рабочей директории, не могу простым языком пояснить сам себе, чтобы убедить окончательно

Добавлено через 8 минут
Para bellum,

PHP
1
2
3
4
5
include 'app/views/layouts/Default/main.php';
 
// main.php
include 'header.php';
include 'footer.php';
всё работает: подключение относительно main.php - происходит

ТЕПЕРЬ ТАК:

PHP
1
2
3
4
5
6
include 'config/container.php';
 
// container.php
// мы находимся в папке config, нам из файла container.php относительно видна папка autoload
// то есть нам доступно в файле container.php сделать include 'autoload/file.php'
$arrays = array_map(fn($file) => include $file, glob('autoload/*.php'));
не работает: подключение относительно container.php - не происходит

вот так я рассуждаю
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
13.10.2021, 12:16 6
Лучший ответ Сообщение было отмечено DefenseMinister как решение

Решение

Цитата Сообщение от DefenseMinister Посмотреть сообщение
типа раз main.php уже подключили по пути app/views/layouts/Default, то внутри main.php подключения производятся относительно app/views/layouts/Default/main.php?
Да. Если PHP, конечно, не найдёт файл с нужным именем в папках, указанных в include_path и в текущей рабочей директории.
В вашем случае рабочей директорией была бы папка, где лежит index.php. Но так как вы меняете рабочую директорию с помощью chdir('..');, то рабочей является папка на уровень выше.
Цитата Сообщение от DefenseMinister Посмотреть сообщение
Почему include ... (fn($file) => include $file) ... НЕ попытается проверить директорию, в которой находится текущий включающий скрипт и ему требуется __DIR__?
Не требуется ему __DIR__. __DIR__ требуется только glob. Если вы вместо результата вызова glob передадите массив строк типа
PHP
1
['autoload/first.php', 'autoload/second.php']
то всё должно работать и без __DIR__.

И да: glob бы тоже работало без __DIR__, если бы вы не меняли текущую рабочую директорию с помощью chdir('..');.

Добавлено через 4 минуты
В общем, я крайне не рекомендую опираться на относительные пути, а использовать абсолютные пути (с __DIR__).
Чтобы не писать кучу __DIR__, можно один раз зарегистрировать в системе (в контейнере, например) имя рабочего каталога. Затем написать функцию, которая будет возвращать абсолютный путь, основываясь на главном каталоге.
1
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
13.10.2021, 12:21  [ТС] 7
Para bellum, короче я понял ТАК: вызов функции в инклудном файле отменяет относительные пути этого файла для применения в этой функции и она начинает отсчёт с рабочего каталога

короче для себя я понял

ок, благодарю

Добавлено через 1 минуту
Цитата Сообщение от Para bellum Посмотреть сообщение
В общем, я крайне не рекомендую опираться на относительные пути, а использовать абсолютные пути (с __DIR__).
Чтобы не писать кучу __DIR__, можно один раз зарегистрировать в системе (в контейнере, например) имя рабочего каталога. Затем написать функцию, которая будет возвращать абсолютный путь, основываясь на главном каталоге.
это всё понятно, просто я гоняю руками код разный, скилл повышаю так сказать в свободное от безделья время
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
13.10.2021, 14:36 8
Я у себя делаю 1 скрипт, который подключает во всех файлах, все рабочие фалы.

И регистрирую там

PHP
1
2
define('DOCUMENT_ROOT', $_SERVER['DOCUMENT_ROOT']);
define('DOCUMENT_ROOT_kit', DOCUMENT_ROOT . '/kit/');
И потом опираясь на DOCUMENT_ROOT, могу подключать те или иные папки.
1
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
13.10.2021, 14:47  [ТС] 9
OpXiv, так не интересно, надо чтобы тот, кто не увидит констант такого рода, [del] и начал думать, а как же тут всё устроено, а если не хочет думать, то пользоваться так, как сделано батей
0
13.10.2021, 14:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2021, 14:47
Помогаю со студенческими работами здесь

Относительный путь к бд
Есть 2 проекта которые используют одну и туже бд. Exe-шник первого храниться в папке...

Относительный путь
Здравствуйте ASP.NET mvc приложения задеплоил в IIS локально. Как сделать чтобы сайт открывался по...

Относительный путь в LESS
Здравствуйте! Возникла такая проблема: Пишу в less-файле, к примеру, следующее: background:...

Относительный путь к файлу
Например есть путь к файлу C:\MP\system_fgjri49\1.txt из программы открываю и читаю 1.txt, но часть...

Относительный путь к файлу
Здравствуйте! Не подскажите как задать относительный путь к файлу? В программе через веб браузер...

Относительный путь к файлу
Добрый день. Изучаю vb.net и возникла потребность в создании относительного пути к файлу (моем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru