Почему эти относительные пути не работают в php - PullRequest
3 голосов
/ 19 февраля 2012

Моя структура приложения выглядит следующим образом

application -> views -> templates
                             // some more files
                     page.php
            -> controllers 
                     home.php        
            -> models 
                     items.php
            router.php
index.php

Первый случай:

Index.php

include 'application/routes.php';

Routes.php

require "controllers/home.php";

Контроллеры / home.php

require '/application/models/clusters.php'; //works
require 'application/models/clusters.php'; //works
require '../models/clusters.php'; //doesn't work

Почему работают первые строки, а не последние?

Второй случай:

Index.php

include 'application/views/page.php';

page.php

glob("application/views/templates/*.php") // array of files
glob("templates/*.php") // empty array

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

Ответы [ 3 ]

5 голосов
/ 19 февраля 2012

Пожалуйста, попробуйте это:

require 'application/controllers/home.php';

require 'application/models/clusters.php';

Проблема в том, что пути в PHP всегда относятся к первому пути к файлу, в данном случае index.php.Поэтому вы должны включить каталог 'application'.

Альтернативой является использование set_include_path: http://php.net/manual/pt_BR/function.set-include-path.php

EDIT

Для просмотра вашего include_path:

echo ini_get('include_path');
1 голос
/ 19 февраля 2012

Меня всегда удивляет, как много людей не понимают значения include_path.

Если вы не указали абсолютный путь для включения / требования (т. Е. Путь, начинающийся с /), то PHPиспользует include_path, чтобы попытаться найти файл, обрабатывая каждую запись пути включения по очереди.Как правило, первая запись во включаемом пути - это.имеется в виду текущий каталог (возвращаемый getcwd (), если он был выполнен в этот момент в скрипте.

0 голосов
/ 19 февраля 2012

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

require '/../models/clusters.php'; //doesn't work
...