2012-05-03 29 views
13

He estado en Internet intentando descubrir la mejor forma de manejar rutas en mi sitio web. ¿Debo usar rutas relativas, rutas absolutas?Práctica recomendada para rutas de PHP

He visto dirname (ARCHIVO) mencionado varias veces. Un problema que tengo con las rutas relativas es que los archivos php que están incluidos en varios otros archivos en diferentes niveles de directorio hacen que las rutas relativas se rompan. Por ejemplo, si la estructura de directorios es

Root 
    A 
    B 
     b 

Y un archivo PHP en B y A incluye otro archivo desde B a continuación, las rutas relativas para el código en el archivo en B serán diferentes.

Lo siento si eso es confuso Estoy teniendo dificultades para escribir lo que estoy tratando de decir.

Por lo tanto, en general, ¿cuál es la mejor manera de manejar las rutas a los archivos con respecto a las operaciones de inclusión y archivo dentro del código?

Gracias

+0

Ese es el problema con "Lo mejor", casi siempre es subjetivo. –

Respuesta

0

Se puede poner todas sus archivos de inclusión en un directorio principal. A continuación, cree una variable de ruta en un archivo de configuración o en el script en sí, que apunta al directorio de inclusión.

+0

Esto funcionaría, pero rompe mi organización. Estoy tratando de mantener mis archivos en una estructura de directorio lógico porque hay tantos. – Nath5

-1

Nueva versión de php (PHP5.3) es posible usar __autoload Por lo tanto, solo necesita determinar la raíz de su aplicación.

+0

¿Autoload analiza la ruta del directorio recursivamente, y si lo hace parece malo para el rendimiento. También parece que autocarga solo funciona para Clases, algunos de mis archivos no son OO. – Nath5

0

La mejor manera de utilizar las convenciones propias de nomenclatura para la estructura de directorios, archivos PHP y nombres de clase de archivo y el diseño de un cargador automático para incluir el archivo

+0

¿Tiene buenos enlaces a ejemplos de creación y autocargador? Soy bastante nuevo en php y todavía no he encontrado un buen tutorial. – Nath5

+0

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

+0

Gracias, lo leí pero parece que solo funciona para OO, algunos de mis archivos no son OO, así que supongo que este método ganó ' t trabajo. – Nath5

10

Tho hay muchas maneras de averiguar el camino que siempre encuentra más fácil definir una constante dentro de un archivo en la raíz del proyecto index.php o un config de ordenación. luego puedo usar SITE_ROOT para includes/class loaders ect, y SITE_URL para vistas, controladores, redireccionamientos ect.

<?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

Con este método, no todos los archivos que van a utilizar el autocargador deben incluir el archivo de configuración. Si es así, es la mejor manera de hacerlo usando una ruta relativa como include ('../../ config.php'); También como mencioné anteriormente, esto funcionará si no todos los archivos son OO – Nath5

+0

define las constantes en su archivo de índice, solo necesita apuntar a su raíz, si su configuración está en la raíz, entonces todo lo que necesita hacer es 'incluir (SITE_ROOT . '/ config.php') 'independientemente de cuán profundo llame que lo incluya, siempre apuntará al mismo archivo. el '__autoload' solo funciona cuando se llaman clases, se guarda al hacer' include (SITE_ROOT. '/ includes /' .$ class_name. '. php'); 'para cada clase, es muy útil para modelos en un patrón MVC ya que normalmente se llama a un controlador desde la clase de enrutador/controlador frontal –

+2

No entiendo muy bien cómo esto soluciona mi problema. Incluso si tengo este nivel de configuración en mi raíz, aún necesita ser incluido usando rutas relativas por todos mis otros archivos. Un ejemplo de los problemas que estoy teniendo es que tengo una clase ErrorReporter que está incluida en todos mis otros archivos que residen en diferentes niveles en la estructura del directorio. Dentro de la clase ErrorReporter tengo algunas rutas, pero si son relativas se vuelven relativas a cualquier clase, incluido ErrorReporter, lo que significa que no están relacionadas con el mismo punto cada vez. – Nath5

0

el Zend Framework tiene unos puntos básicos sobre la optimización de incluir caminos:

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

Incluso si usted no está utilizando el marco de Zend, estos son buenos punteros. Los bulletpoints generales son:

  • utilizar rutas absolutas
  • Reducir el número de incluir caminos que defina
  • Definir el directorio actual pasada, o nada en absoluto
  • definir su Zend Framework include_path tan pronto como sea posible (No es realmente relevante si no usa Zend)
Cuestiones relacionadas