относительный путь в require_once не работает

103

У меня следующая структура

otsg
 > class
   > authentication.php
   > database.php
   > user.php
 > include
   > config.inc.php
   > encryption.php
   > include.php
   > session.php
 > index.php
 > registration.php

include.php файл имеет следующее

ini_set('display_errors', 1);
error_reporting(E_ALL);

ini_set('include_path',ini_get('include_path').':/Applications/MAMP/htdocs/otsg/:');
require_once 'config.inc.php';
require_once '../class/database.php';
require_once '../class/user.php';
require_once 'encryption.php';
require_once 'session.php';
require_once '../class/authentication.php';

и на странице index.php я включил

require_once 'include/include.php';

Когда я открываю страницу index.php, я получаю следующее предупреждение и фатальную ошибку. Я не понимаю, что вызывает эту ошибку. Когда я указал абсолютный путь, он работает. Но я считаю, что абсолютный путь - не лучшая идея.

Warning: require_once(../class/database.php) [function.require-once]: failed to open stream: No such file or directory in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Fatal error: require_once() [function.require]: Failed opening required '../class/database.php' (include_path='.:/Applications/MAMP/bin/php5.3/lib/php:/Applications/MAMP/htdocs/otsg/include/:') in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

заранее спасибо

user525146
источник
Обычно я делаю Objective-C и пытаюсь заполучить php-скрипты, и грустно видеть, что я уже потратил 2 часа на то, чтобы выяснить, как правильно включать файлы в PHP. С X-кодом все так просто.
rohan-patel
С этой ошибкой часто сталкиваются, и чтобы быстро устранить ее, выполните следующие действия: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

Ответы:

217

Использовать

__DIR__

чтобы получить текущий путь к сценарию, и это должно решить вашу проблему.

Так:

require_once(__DIR__.'/../class/user.php');

Это предотвратит случаи, когда вы можете запустить PHP-скрипт из другой папки, и поэтому родственные пути не будут работать.

Изменить: исправлена ​​проблема с косой чертой

Raisen
источник
42
Осторожно! __DIR__является новым в PHP 5.3. Если вам нужно, чтобы этот сценарий работал в более ранних версиях PHP, вам следует использовать dirname(__FILE__)вместо него.
Charles
27
Обратите внимание, что вам следует вручную добавить завершающую косую черту после __DIR__. Итак: require_once(__DIR__.'/../class/user.php'); Согласно документации , косая черта в конце опускается, за исключением корневого каталога.
Ариэль Аллон
9
Спасибо за помощь, но до сих пор не понимаю, зачем __DIR__это нужно. Документы PHP, кажется, говорят, что PHP по умолчанию будет искать каталог текущего скрипта. Кто-нибудь может пролить свет?
Дэвид
1
@David Я думаю, это нужно, когда вы импортируете файл из двух мест одновременно. Например, у вас есть файл с расширением require "../a.php". Если этот файл импортирован из другого файла (x) в dir1/dir2/x.phpвключенном файле будет dir1/a.php, но если x находится в dir1/dir2/dir3/x.php, включенный файл будет dir1/dir2/a.phpи т.д. Или я ошибаюсь?
Хосе Рамон
1
Теперь здесь есть контрольный список устранения этой частой ошибки: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew
17

для php версии 5.2.17 __DIR__не будет работать, будет работать только с php 5.3

Но для более старой версии php dirname(__FILE__)отлично

Например, напишите так

require_once dirname(__FILE__) . '/db_config.php';
Mobile Tech.
источник
1

В моем случае это не работает, даже с __DIR__или getcwd()он держит выбирая неправильный путь, я решил, определив Костант в каждом файле , мне нужно с абсолютным базовым путем проекта:

if(!defined('THISBASEPATH')){ define('THISBASEPATH', '/mypath/'); }
require_once THISBASEPATH.'cache/crud.php';
/*every other require_once you need*/

У меня есть MAMP с php 5.4.10, и моя иерархия папок базовая:

q.php 
w.php 
e.php 
r.php 
cache/a.php 
cache/b.php 
setting/a.php 
setting/b.php

....

linuxatico
источник
0

Я только что столкнулся с той же проблемой, когда все работало нормально, вплоть до того момента, когда у меня были включения в другие включения.

require_once '../script/pdocrud.php';  //This worked fine up until I had an includes within another includes, then I got this error:
Fatal error: require_once() [function.require]: Failed opening required '../script/pdocrud.php' (include_path='.:/opt/php52/lib/php')

Решение 1. (нежелательное жесткое кодирование имени моей общедоступной html-папки, но оно работает):

require_once $_SERVER["DOCUMENT_ROOT"] . '/orders.simplystyles.com/script/pdocrud.php';

Решение 2. (нежелательный комментарий выше о том, что DIR работает только с php 5.3, но работает):

require_once __DIR__. '/../script/pdocrud.php';

Решение 3. (Я не вижу недостатков, и он отлично работает на моем php 5.3):

require_once dirname(__FILE__). '/../script/pdocrud.php';
хамский
источник