2012-05-03 28 views
13

Ich habe überall im Internet versucht, herauszufinden, der beste Weg, um Pfade auf meiner Website zu behandeln. Sollte ich relative Pfade, absolute Pfade verwenden?Best Practice für PHP-Pfade

Ich habe dirname (FILE) mehrmals erwähnt. Ein Problem, das ich mit relativen Pfaden habe, ist, dass PHP-Dateien, die von mehreren anderen Dateien auf verschiedenen Verzeichnisebenen enthalten sind, dazu führen, dass die relativen Pfade brechen. Zum Beispiel, wenn die Verzeichnisstruktur ist

Root 
    A 
    B 
     b 

Und eine PHP-Datei in b und A umfasst eine andere Datei von B dann die relativen Pfade für den Code in der Datei in B anders sein werden.

Tut mir leid, wenn das verwirrend ist Ich habe eine harte Zeit tippen, was ich versuche zu sagen.

Also im Allgemeinen, was ist der beste Weg, um Pfade zu Dateien in Bezug auf umfasst und Dateivorgänge innerhalb des Codes zu behandeln.

Danke

+0

Das ist das Problem mit "Best" allem, es ist fast immer subjektiv. –

Antwort

0

Sie alle Ihre Dateien in ein Hauptverzeichnis enthalten setzen könnten. Erstellen Sie dann eine Pfadvariable in einer Konfigurationsdatei oder im Skript selbst, die auf das Include-Verzeichnis verweist.

+0

Das würde funktionieren, aber es bricht meine Organisation. Ich versuche, meine Dateien in einer logischen Verzeichnisstruktur zu behalten, weil es so viele gibt. – Nath5

-1

Neue Version von PHP (PHP5.3) ist möglich zu verwenden __autoload So müssen Sie nur root Ihrer Anwendung ermitteln.

+0

Durchsucht autoload den Verzeichnispfad rekursiv, und wenn dies der Fall ist, scheint dies für die Leistung schlecht zu sein. Auch scheint es, dass Autoload nur für Klassen funktioniert, einige meiner Dateien sind nicht OO. – Nath5

0

Der beste Weg, die richtigen Namenskonventionen für die Verzeichnisstruktur, PHP-Dateien und Klassennamen der Datei und das Designs eines Autoloader enthält die Datei

+0

Haben Sie gute Links zu Beispielen zum Erstellen und Autoloader, ich bin ziemlich neu in PHP und habe noch kein gutes Tutorial gefunden. – Nath5

+0

http://php.net/manual/en/language.oop5.autoload.php –

+0

Danke, ich lese das, aber das scheint nur für OO zu funktionieren, einige meiner Dateien sind nicht OO, also rate ich, diese Methode gewonnen ' t arbeiten. – Nath5

10

Tho gibt es viele Möglichkeiten, um den Pfad zu finden heraus, dass ich immer Finden Sie es am einfachsten, eine Konstante innerhalb einer Datei im Stammverzeichnis des Projekts index.php oder config der Sorte zu definieren. dann kann ich SITE_ROOT für includes/class loaders ect und SITE_URL für Ansichten, Controller, Redirects ect verwenden.

<?php 
$root=pathinfo($_SERVER['SCRIPT_FILENAME']); 
define ('BASE_FOLDER', basename($root['dirname'])); 
define ('SITE_ROOT', realpath(dirname(__FILE__))); 
define ('SITE_URL', 'http://'.$_SERVER['HTTP_HOST'].'/'.BASE_FOLDER); 
?> 

Basic class Autoloader

<?php 
function __autoload($class_name) { 
    include (SITE_ROOT.'/includes/'.$class_name.'.php'); 
} 
$obj = new MyClass1(); 
$obj2 = new MyClass2(); 
?> 
+0

Bei dieser Methode müssen nicht alle Dateien, die den Autoloader verwenden, die Konfigurationsdatei enthalten. WENN das der beste Weg ist, dies mit einem relativen Pfad wie include ('../../ config.php') zu tun; Wie ich bereits erwähnt habe, funktioniert das, wenn nicht alle Dateien OO sind – Nath5

+0

definieren Sie die Konstanten in Ihrer Indexdatei, es muss nur auf Ihre root zeigen, wenn Ihre Konfiguration im Stamm ist, dann alles, was Sie brauchen Todo ist 'include (SITE_ROOT . '/ config.php') 'unabhängig davon, wie tief Sie aufrufen, dass es immer auf die gleiche Datei verweist. das '__autoload' funktioniert nur beim Aufruf von Klassen, es speichert' include (SITE_ROOT. '/ includes /'.$ class_name.'. php '); 'für jede Klasse, es ist sehr praktisch für Modelle in einem MVC-Muster als Controller wird normalerweise von der Router/Front-Controller-Klasse –

+2

aufgerufen Ich verstehe nicht ganz, wie das mein Problem behebt. Selbst wenn ich diese Config-Ebene in meinem root habe, muss sie immer noch mit relativen Pfaden von allen meinen anderen Dateien eingebunden werden. Ein Beispiel für die Probleme, die ich habe, ist, dass ich eine ErrorReporter-Klasse habe, die von allen anderen Dateien enthalten ist, die sich auf verschiedenen Ebenen in der Verzeichnisstruktur befinden. Innerhalb der ErrorReporter-Klasse habe ich einige Pfade, aber wenn sie relativ sind, werden sie relativ zu jeder Klasse, die ErrorReporter enthält, was bedeutet, dass sie nicht jedes Mal auf dieselbe Stelle bezogen sind. – Nath5

0

Das Zend Framework hat einige gute Hinweise zu Pfaden zu optimieren sind:

http://framework.zend.com/manual/1.10/en/performance.classloading.html

Auch wenn Sie nicht mit dem Zend Framework, diese sind gute Zeiger. Die allgemeinen bulletpoints sind:

  • Verwenden absolute Pfade
  • Reduzieren Sie die Anzahl der Pfade enthalten Sie
  • definieren das aktuelle Verzeichnis zuletzt definieren, oder gar nicht
  • Definieren Sie Ihre Zend Framework so früh wie möglich (nicht wirklich relevant, wenn du Zend nicht verwendest)