относителни пътища с include и require

nbacool2

Registered
Здравейте. Ако имам папка "articles" и в нея имам файл "articles.php" и файл "connect.php" , а в папката "articles" има друга папка с име "blog" и в нея има файл "blog.php" и със кодовете


articles.php

<?php
include "../blog/blog.php";
?>

connect.php

<?php
mysql_connect(etcetc);
?>

blog.php

<?php
include "../articles/connect.php";
?>



та въпроса ми е - относителният път в blog.php се счита от мястото на blog.php , или когато articles.php инклудва блог.пхп се счита от мястото на articles.php? Аз мисля, че е от blog.php , но за да съм сигурен ви питам.
 
Малко си объркал пътищата в примера, но разбрах какво питаш :)

Кода във файл, извикан с include/require, се изпълнява все едно е написан в самия файл. Следователно, ако във article.php извикаш blog.php и в него се извиква connect.php, пътя към connect.php ще се разглежда спрямо този на article.php, а не спрямо blog.php

Поради тази причина, всички фреймъуркове и CMS-и дефинират константа, която съдържа абсолютния път до главната директория на фреймуърка/CMS-а.

Ето пример:
PHP:
<?php

// Дефинираме абсолютния път до файла
// Обикновено се дефинира в index/config файла
define('SITE', dirname(__FILE__).DIRECTORY_SEPARATOR);

// В articles/articles.php
include SITE.'blog/blog.php';

// В blog/blog.php
include SITE.'includes/connect.php';

И всичко ще ти е бомба. Така ако хоста ти е на Линукс, SITE ще съдържа нещо от рода на: "/home/username/www/mysite.com/public/",
а под Win: "C:\www\htdocs\" :)
 
Благодаря. Много добра идея. Ще пренапиша всичко, използвайки този начин. А иначе дефинирането на тази константа трябва да стане във файл, който е директно във главната root директория, иначе ако е в public_html/stuff/configuration.php ще се основава на stuff . Правилно ли разсъждавам? А и как е по-добре със / или със DIRECTORY_SEPARATOR . Разрових се в нета и пишеше, че / се поддържа от Unix и Windows сървъри .
http://www.talkphp.com/general/2487-directory_separator-not-necessary.html

:)
 
Ами честно казано не знам защо използвам DIRECTORY_SEPARATOR, просто така съм свикнал.

А ако искаш тази константа да ти се дефинира в конфиг файла, който е в една директория по-дълбоко от главната директория можеш да направиш така:
PHP:
<?php
define('SITE', realpath(dirname(__FILE__).'../').'/');

dirname като ти върне стойност от рода на "/home/username/www/stuff/" и след това се добавя накрая "../" и става "/home/username/www/stuff/../". С realpath този път се нормализира и ще ти изкара само "/home/username/www/" :)
 
Аз за наклонената черта правя така

PHP:
define("DS", DIRECTORY_SEPARATOR);
define("ROOT", dirname(dirname(__FILE__))); # понеже са ми folder/folder/file.php

и ползвам така

PHP:
echo ROOT . DS . 'lib' . DS;

Като съм си структурирал така кода, че тези дефиниции да си ми глобални и да мога да ги ползвам навсякъде, дори в класове.
 

Back
Горе