Для получения дополнительных разъяснений по этому вопросу я решил опубликовать ответ.
Основная проблема, которая была предоставлена в коде:
require __DIR__.'/../sample/vendor/autoload.php';
$app = require_once __DIR__.'/../sample/bootstrap/app.php';
Возможно, оба пути недопустимы.Судя по более ранним комментариям, фодеры не существуют.
Согласно Manual _DIR_
будет содержать каталог текущего файла - на самом деле более правильным было бы сказать, что он содержит каталогфайл, в котором он находится. Переменная
_DIR_
трудна для работы, когда речь идет о создании абсолютных путей, поскольку она уже является почти абсолютным путем текущего файла.
Есть несколько других способов получить правильный путь, и среди них самый простой, вероятно, самый простой и, вероятно, самый быстрый, будет использовать $_SERVER['DOCUMENT_ROOT']
, который содержит
корневой каталог документа, в котором находится текущий скриптвыполняется, как определено в файле конфигурации сервера. Из руководства по Php
Я попытаюсь привести некоторые примеры, которые показывают проблемы с переменной _DIR_
и как можно использовать $_SERVER['DOCUMENT_ROOT']
.
Iтакже будет несколько копировать вашу структуру на самом базовом уровне.
ПРИМЕЧАНИЕ. Все мои примеры выполняются на локальном хосте под Windows, что только в дальнейшем докажет, что _DIR_
неНадежный
Я взял структуру файлов и смоделировал ее только в две папки, по одному файлу в каждой папке.Моя относительная файловая структура выглядит буквально как:
public_html/index.php
и sample/include.php
.
Теперь внутри index.php сначала вы положили этот код
<?php
echo __DIR__.'/../sample/include.php<br>';
?>
Который выдаст C:\xampp\htdocs\myWordpress\public_html/../sample/include.php
, когда я его запусту.Вывод является допустимым путем для Windows, хотя и выполнение require
на нем должно работать.
Теперь я меняю index.php на
<?php
echo __DIR__.'/sample/include.php<br>';
?>
ПРИМЕЧАНИЕ: я в основном только удалил /../
из пути.
При повторном запуске - вывод будет C:\xampp\htdocs\myWordpress\public_html/sample/include.php
, что будет очень недопустимым путем в Windows.- папка не существует.
Два приведенных выше примера доказывают, что переменная _DIR_
ненадежна.
Теперь рассмотрим следующее index.php
<?php
echo $_SERVER['DOCUMENT_ROOT'].'/sample/include.php<br>';
?>
Когда я запустил это - он выведет `Для получения дополнительных разъяснений по этому вопросу, я решил опубликовать ответ.
Основная проблема, связанная с предоставленным кодом:
require __DIR__.'/../sample/vendor/autoload.php';
$app = require_once __DIR__.'/../sample/bootstrap/app.php';
Оба пути, вероятно, являются недопустимыми, поскольку оба, вероятно, не существуют.
Согласно Manual _DIR_
будет содержать каталог текущего файла - на самом деле более правильным будет сказать в немсодержит каталог файла, в котором он находится. С переменной
_DIR_
трудно работать, когда речь идет о создании абсолютных путей, поскольку она уже является почти абсолютным путем.
Есть несколько других способов получить правильный путь, и среди них самый простой, вероятно, самый простой и, вероятно, самый быстрый, будет использовать $_SERVER['DOCUMENT_ROOT']
, который содержит
Корневой каталог документа, в котором находится текущийСценарий выполняется, как определено в файле конфигурации сервера. Из руководства по Php
Я попытаюсь привести некоторые примеры, которые показывают проблемы с переменной _DIR_
и как можно использовать $_SERVER['DOCUMENT_ROOT']
.
Iтакже будет несколько копировать вашу структуру на самом базовом уровне.
ПРИМЕЧАНИЕ. Все мои примеры выполняются на локальном хосте под Windows
Iвзял структуру файлов и смоделировал ее только в две папки, по одному файлу в каждой папке.Моя относительная файловая структура выглядит буквально как:
public_html/index.php
и sample/include.php
.
Теперь внутри index.php сначала вы положили этот код
<?php
echo __DIR__.'/../sample/include.php<br>';
?>
Который выдаст C:\xampp\htdocs\myWordpress\public_html/../sample/include.php
, когда я его запусту.Однако в Windows выводится правильный путь, и выполнение require
на нем должно работать.
Теперь я меняю index.php на
<?php
echo __DIR__.'/sample/include.php<br>';
?>
ПРИМЕЧАНИЕ: я в основном только удалил /../
из пути.
При повторном запуске - вывод будет C:\xampp\htdocs\myWordpress\public_html/sample/include.php
, что является очень неверным путем в Windows.Папка не существует.
Теперь рассмотрим следующее index.php
<?php
echo $_SERVER['DOCUMENT_ROOT'].'/sample/include.php<br>';
?>
Когда я запусту это - он выдаст C:/xampp/htdocs/myWordpress/sample/include.php
, что является Существующий валидный путь , который позже можно будет использовать, например, требуют.
Рабочий пример, показывающий использование и разницу между выходными значениями _DIR_
и $_SERVER['DOCUMENT_ROOT']
, вероятно будет выглядеть ниже
index.php
<?php
echo 'Directory of index.php file is:<span style="color:red">'. __DIR__.'</span></br>';
echo 'File include.php will be included from:<span style="color:red">'. $_SERVER['DOCUMENT_ROOT'].'/sample/include.php</span></br>' ;
require_once $_SERVER['DOCUMENT_ROOT']."/sample/include.php";
?>
include.php
<?php
echo 'Directory of include.php file determined by `__DIR__` is:<span style="color:red">'. __DIR__.'</span></br>';
echo 'Directory of include.php file determined by usage of $_SERVER[\'DOCUMENT_ROOT\']:<span style="color:red">'. $_SERVER['DOCUMENT_ROOT'].'/sample/include.php</span></br>';
?>
Я сделал пути красными, чтобы получить дополнительныевнимание к ним.
Этот пример покажет, что __DIR__
и $_SERVER['DOCUMENT_ROOT']
возвращают разные результаты в одной системе на одном виртуальном сервере.
DIR может также использоваться для достижения того же результата с чистыми путями Windows - это будет некрасиво.
Добавление строки
echo 'The valid directory of include.php file using __DIR__ is:<span style="color:red">'.__DIR__.'\\..\\sample\\</span></br>';
в index.php несколько покажетчто DIR можно использовать в Windows и только в Windows! , в Unix это должно и не получится.Это также показывает, что его использование в некоторой степени зависит от платформы, что также означает, что оно не очень надежно.
EDIT Приведенный выше пример на самом деле очень плохой.Это показывает неправильное и уродливое кодирование.И я бы не показал это, если бы не видел реальный производственный код, подобный этому, один раз.(Не мое)
Нижняя строка для всех этих примеров: - Используйте $_SERVER['DOCUMENT_ROOT']
при создании путей и не используйте __DIR__
.
Я надеюсь, что мои примеры в некоторой степени показывают, почему я думаю $_SERVER['DOCUMENT_ROOT']
- лучшая идея.
Редактировать 1 Полагаю, мои ссылки на документы и объяснения были не очень хорошими.
Судя по изображениям вашей файловой структуры, ваши путидолжно быть:
require $_SERVER['DOCUMENT_ROOT'].'/sample/vendor/autoload.php';
$app = require_once $_SERVER['DOCUMENT_ROOT'].'/sample/bootstrap/app.php';
Но это действительно зависит от того, что содержит $_SERVER['DOCUMENT_ROOT']
.И что содержат относительные пути к $_SERVER['DOCUMENT_ROOT']
.