Cum să includem fișierele PHP care necesită o cale absolută?

Am o structură de directoare ca următoarele;

script.php

inc/include1.php
inc/include2.php

objects/object1.php
objects/object2.php

soap/soap.php

Acum, folosesc acele obiecte atât în ​​ script.php , cât și în /soap/soap.php , le-aș putea muta, dar vreau structura directorului, . Când se execută script.php , calea include inc / include.php și atunci când se execută /soap/soap.php este . / inc , căile absolute absolută, / mnt / webdev / [project name] /inc/include1.php ... Dar este o soluție urâtă dacă vreodată vreau să mut directorul o locație diferită.

Deci, există o modalitate de a utiliza căi relative sau o modalitate de a genera programabil "/ mnt / webdev / [project name] /" ?

0
fr hi bn

10 răspunsuri

Puteți utiliza căi relative. Încercați __ FILE __ . Aceasta este o constantă PHP care întoarce întotdeauna calea / numele fișierului în care se află scriptul. Deci, în soap.php , ai putea să faci:

include dirname(__FILE__).'/../inc/include.php';

Calea completă și numele fișierului   fişier. Dacă se utilizează în interiorul unui include,   numele fișierului inclus este returnat.   Din moment ce PHP 4.0.2, __ FILE __ întotdeauna   conține o cale absolută cu   simbolinks rezolvate, în timp ce în mai vechi   versiuni pe care le conținea calea relativă   în anumite circumstanțe.    (sursă)

O altă soluție ar fi să setați include path în fișierul httpd.conf sau .htaccess.

0
adăugat
Cred că ar trebui să adăugați un / la începutul expresiei citate, pentru a separa .. din numele FILE .
adăugat autor Dunaril, sursa
Rețineți că din PHP 5.3.0 puteți utiliza constanta magică __ DIR __ , mai degrabă decât să utilizați dirname (__FILE __) . (docuri PHP)
adăugat autor Erwin Wessels, sursa
include dirname (__ FILE __). / .. / inc / include.php '; Nu uitați "/" înainte de calea relativă.
adăugat autor Steven Leimberg, sursa

Ați putea defini o constantă cu calea către directorul rădăcină al proiectului dvs. și apoi puneți-o la începutul căii.

0
adăugat

Cred că cea mai bună cale este să îți puneți inclus în calea dvs. PHP include. Există mai multe modalități de a face acest lucru, în funcție de configurația dvs.

Apoi, puteți pur și simplu să vă referiți la

require_once 'inc1.php';

din interiorul oricărui fișier, indiferent de locul în care este inclus în fișierele dvs. sau în fișierele accesibile de pe web sau orice nivel de subdirectoare imbricate.

Aceasta vă permite să includeți fișierele dvs. în afara radacinii serverului web, ceea ce reprezintă o bună practică.

de exemplu.

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

De asemenea, verificați __autoload pentru încărcarea leneș a fișierelor de clasă

http://www.google.com/search?q=setting+ PHP + + includ calea

http://www.google.com/search?q=__autoload

0
adăugat
    

@Flubba, îmi permite să am foldere în directorul meu de includere? apartamentele incluse includ directoarele îmi dau coșmaruri. ca directorul obiectelor întregi ar trebui să fie în directorul inc.

  

Da, absolut. De exemplu, folosim un singur strat de subfoldere, în general:

require_once('library/string.class.php')

Trebuie să aveți grijă să vă bazați pe calea inclusă prea mult pe site-uri de trafic foarte mari, deoarece PHP trebuie să vâneze prin directorul curent și apoi toate directoarele pe calea include pentru a vedea dacă fișierul dvs. este acolo și acest lucru poate să încetinească Lucruri dacă ești ciocănit.

Deci, de exemplu, dacă faci MVC, ai pune calea la aplicația directă în calea include și apoi specifică se referă la lucrurile din formular

'model/user.class'
'controllers/front.php'

sau orice altceva.

Dar, în general vorbind, vă permite doar să lucrați cu căi într-adevăr foarte scurte în PHP, care vor funcționa de oriunde și este mult mai ușor de citit decât toate cele care au rădăcina reală a documentului malarkey.

Beneficiul acelor alternative bazate pe script-uri au sugerat că acestea lucrează oriunde, chiar și pe casete partajate; stabilirea căii include necesită un pic mai mult gândire și efort, dar așa cum am menționat vă permite să începeți să utilizați __autoload care doar cel mai tare.

0
adăugat

Ar trebui să funcționeze

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

Edit: added imporvement by aussieviking

0
adăugat
doar o întrebare, de ce realpath() pentru $ _SERVER ["DOCUMENT_ROOT"]? Aceasta nu trebuie să scoată întotdeauna calea canonică?
adăugat autor João Pimentel Ferreira, sursa
Aveți grijă, acest lucru va funcționa numai dacă executați scriptul prin intermediul unui server web care conține DOCUMENT_ROOT
adăugat autor Phil, sursa

O altă opțiune, legată de Kevin, este folosirea __ FILE __ , înlocuind însă numele fișierului PHP din interiorul lui:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

Am folosit asta pentru o vreme. Singura problemă este că uneori nu aveți $ _ SERVER ['SCRIPT_NAME'] , dar uneori există o altă variabilă similară.

0
adăugat

have a look at http://au.php.net/reserved.variables

I think the variable you are looking for is: $_SERVER["DOCUMENT_ROOT"]

0
adăugat

Un alt mod de a face acest lucru care elimină orice nevoie de include în totalitate este de a utiliza funcție autoload . Inclusiv tot ceea ce scenariul dvs. are nevoie "Just in Case" poate împiedica performanța. Dacă includeți toate definițiile de clasă sau de interfață și doriți să le încărcați numai atunci când este necesar, puteți supraîncărca funcția __ autoload() cu propriul cod pentru a găsi fișierul de clasă corespunzător și încărcați-l numai când se numeste. Iată exemplul din manual:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

Atâta timp cât setați variabilele include_path în consecință, nu trebuie să includeți din nou un fișier de clasă.

0
adăugat

Am descoperit ca lucrul acesta este foarte bun!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

Utilizare:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>
0
adăugat

Dacă intenționați să includeți o cale specifică în majoritatea fișierelor din aplicația dvs., creați o variabilă globală în directorul rădăcină.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

Acum, această variabilă globală " APPLICATION_PATH " poate fi utilizată pentru a include toate fișierele în loc de a apela realpath() de fiecare dată când includeți un fișier nou.

EX:

include(APPLICATION_PATH ."/config/config.ini";

Sper ca ajuta ;-)

0
adăugat
PHP România, Moldova
PHP România, Moldova
173 participanți

Vorbim despre Yii, Laravel, Symphony, MySQL, PgSQL, WP, OpenCart... Pentru confort, opriți notificările. Parteneri: https://ciupacabra.com @js_ro @node_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro Joburi: @php_job @Grupuri_IT