2016-06-22 3 views
1

я иметь следующую структуру каталогов: (. Из «приложения» реж)PHP: путать о пути к файлам, включает в себя не работают, как они должны, я думаю

--root 
    |--datasource 
    | '--datasource.php 
    | 
    |--public_html 
    | '--app 
    |  |--view 
    |  |--model 
    |  |--core 
    |  '--App.php 
    |  |--controler 
    |  |--init.php 
    | 
    |-----css 
    |-----js 
    |-----index.php 

Мой init.php входит в index.php и содержит все другие важные включает в себя для моего проекта:

приложение/init.php:

require_once '../../datasource/datasource.php'; --> Not working 
    //require_once '../datasource/datasource.php'; --> Working 
    require_once 'app/core/App.php'; --> Working 
    //FUN PART: 
    require_once 'core/App.php'; --> Still working, wtf? 

    echo getcwd(); //gives: /home/prbh0pr/public_html 

Вопрос: Почему мой '../../datasource/datasource.php' включают потерпеть неудачу? И что более важно, почему «core/App.php» не работает?

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

index.php

<?php 

     require_once 'app/init.php'; 

     $app = new App; 

    ?> 
+0

Попробуйте добавить '. /' Перед путей. Также проверьте наличие вызовов 'setcwd()'. – ShiraNai7

+0

первый не работает, потому что после '../../' вы будете за корневым каталогом ('public_html /../' is 'root',' public_html /../../ 'является родителем' root '). – Arnial

+0

Во-вторых, в дополнение к 'setcwd' также проверьте' __autoload' и 'spl_autoload_register' – Arnial

ответ

0

Прежде всего, проверьте свой путь с get_include_path()

../../datasource/datasource.php терпит неудачу, потому что ваш текущий каталог public_html и вы используете относительный путь.

Использование. в включенном пути допускает относительное включение, поскольку это означает текущий каталог. Тем не менее, более эффективно явно использовать include ./file, чем PHP, всегда проверяющий текущий каталог для каждого include.

Найдено в documentation about ini.include-path

app/core/App.php и core/App.php работают, потому что

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

Найдено в документации о включают

app/core/App.php находится в текущем рабочем каталоге (home/prbh0pr/public_html) и core/App.php найден с помощью вызова собственного каталога сценария (~/public_html/app)