PHP Включить ведение себя странно? - PullRequest
1 голос
/ 18 января 2010

По какой-то причине, если я inlcude() файл глубже в структуре файла, где находится файл, вызывающий include(), он работает файл, или если я включаю файл на том же уровне.

Если я пытаюсь перейти include('../backFile.php'), это говорит мне, что файла не было?

Любая помощь: (

Ответы [ 6 ]

3 голосов
/ 18 января 2010

В дополнение к тому, что сказали другие, я realpath все ... например:

include(realpath(dirname(__FILE__).'/../myFile.php'));

3 голосов
/ 18 января 2010

Я не совсем уверен, какова ваша точная ситуация. Вероятно, есть простое решение, которое включит работу. Это исправление, вероятно, будет предоставлено в другом ответе.

Вместо этого я собираюсь предложить вам best-practice (ну, может быть, не «лучший», но хорошая практика):

В первом вызываемом вами файле или в файле конфигурации определите константу, которая является путем к первому каталогу, в котором содержатся ваши файлы.

Так что если вы работаете в /home/user/domains/test.com/:

DEFINE('SITE_PATH', '/home/user/domains/test.com/');

Тогда, когда вы включаете что-то, используйте это как отправную точку

include(SITE_PATH . "lib/test.class.php");

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

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

1 голос
/ 18 января 2010

Возможно, вам следует попробовать основать его на текущем каталоге:

include(getcwd() . '../backFile.php');
1 голос
/ 18 января 2010

Попробуйте это:

include('./../backFile.php');
0 голосов
/ 18 января 2010

Когда вы указываете путь (абсолютный или относительный) в параметре для include, он не использует системный путь включения, а вместо этого разрешает путь относительно «основного» файла , который обычно index.php какой-то.

Например, у вас есть три файла, /www/index.php:

<?php
include('libs/init.php');

/www/test.php:

I was included!    

и /www/libs/init.php:

<?php
include('../test.php');

Вызов include('../test.php') будет решен с использованием контекста каталога index.php, который равен /www, поэтому вместо /www/test.php вы фактически пытаетесь включить /test.php.

Если честно, я понятия не имею, почему это так работает. Мой libs/init.php решает это так:

define('DIR_ROOT', str_replace('\\', '/', dirname(dirname(__FILE__))));

И затем предварите все пути этим. Вызов str_replace предназначен для более плавной обработки путей Windows.

0 голосов
/ 18 января 2010

include зависит от директивы include_path php, которая по умолчанию . (каталог, в котором находится текущий исполняемый скрипт).

Используйте ini_set или set_include_path , чтобы установить свой собственный include_path.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...