2014-12-14 1 views
-1

У меня есть некоторые проблемы с включением файлов относительно. Проблема заключается не в том, что require_once не может найти файл, а в том, что он может найти файл в том месте, где нет файла. Я разделил проблему на три небольших класса.php require_once содержит файлы, относящиеся к файлу, а не рабочий каталог

Так что это мой реж структура:

public_html/ 
    index.php 
    commands/ 
     CommandFactory.php 
     account/ 
      Status.php 

index.php:

require_once 'commands/CommandFactory.php'; 

$factory = new CommandFactory(); 

CommandFactory.php:

class CommandFactory{ 

    public function __construct() 
    { 
     echo getcwd() . '<br/>'; //xxx\public_html (which is good, this is where index.php is 
     //require_once 'account/Status.php'; // This works as expected 
     require_once 'account/Status.php'; // This ALSO works, but it shouldn't 

     $status = new Status(); // This works, though it shouldn't. 
    } 
} 

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

+0

Может кто downvoted мой вопрос объяснить, почему? – David

+0

Если вы требуете, чтобы путь относился к текущему файлу. Не индекс, так или иначе, включая файл внутри класса, фактически не является хорошей практикой. Вы обязательно должны изучить автозагрузку своих классов. – DarkBee

+0

«Если вам нужно, чтобы путь был относительно текущего файла». Это не правильно ». И я знаю, что я делаю в ООП. Кроме того, если это относилось к текущему файлу, почему« команды/account/Status.php »также работают? – David

ответ

1

С сайта php.net:

Файлы включены на основе пути к файлу данного или, если иное не указано, указанный в include_path. Если файл не найден в include_path, включите, наконец, проверите собственный каталог вызывающего сценария и текущий рабочий каталог перед сбоем. Конструкция будет выдавать предупреждение, если он не может найти файл; это является другое поведение, требуют, который будет испускать фатальную ошибку

source

+0

Спасибо :) Ха-ха, я бы предпочел, чтобы это было более строгим. – David

+0

Нет проблем. Мне нравится размещать __DIR__ перед каждым включением/требовать от себя жесткого – DarkBee

+0

Ну, exaccty из-за __DIR__ Я думал, что PHP никогда не включал классы относительно относительных путей. Но я должен был иметь тенденцию к php.net. – David

Смежные вопросы