2011-03-23 14 views
5

Actualmente estoy desarrollando una aplicación web PHP y me gustaría saber cuál es la mejor manera de incluir archivos (include_once) de manera que el código todavía es maintanable. Por mantenible quiero decir que si quiero mover un archivo, sería fácil refactorizar mi aplicación para que funcione correctamente.¿La mejor manera de incluir archivos en PHP?

que tienen una gran cantidad de archivos desde que tratar de tener buenas prácticas de programación orientada a objetos (una clase = un archivo).

Aquí es una estructura de clases típico para mi aplicación:

namespace Controls 
{ 
use Drawing\Color; 

include_once '/../Control.php'; 

class GridView extends Control 
{ 
    public $evenRowColor; 

    public $oddRowColor; 

    public function __construct() 
    { 
    } 

    public function draw() 
    { 
    } 

    protected function generateStyle() 
    { 
    } 

    private function drawColumns() 
    { 
    } 
} 
} 
+0

que he tenido esta pregunta también, y he llegado a la consecuencia de que PHP realmente no tiene un muy buen sistema de paquetes. Netbeans ayuda sin embargo. –

Respuesta

4

Depende de lo que usted está tratando de lograr con exactitud.

Si desea tener una asignación configurable entre los archivos y los directorios en los que residen, debe calcular una abstracción de ruta e implementar algunas funciones de cargador para trabajar con eso. Haré un ejemplo.

Digamos que utilizaremos una notación como Core.Controls.Control para referirnos al archivo (físico) Control.php que se encontrará en el directorio (lógico) Core.Controls. Vamos a que hacer una implementación de dos partes:

  1. instruir a nuestros cargador que Core.Controls se asigna al directorio físico /controls.
  2. Busque Control.php en ese directorio.

Así que aquí es un comienzo:

class Loader { 
    private static $dirMap = array(); 

    public static function Register($virtual, $physical) { 
     self::$dirMap[$virtual] = $physical; 
    } 

    public static function Include($file) { 
     $pos = strrpos($file, '.'); 
     if ($pos === false) { 
      die('Error: expected at least one dot.'); 
     } 

     $path = substr($file, 0, $pos); 
     $file = substr($file, $pos + 1); 

     if (!isset(self::$dirMap[$path])) { 
      die('Unknown virtual directory: '.$path); 
     } 

     include (self::$dirMap[$path].'/'.$file.'.php'); 
    } 
} 

Se podría utilizar el cargador de la siguiente manera:

// This will probably be done on application startup. 
// We need to use an absolute path here, but this is not hard to get with 
// e.g. dirname(_FILE_) from your setup script or some such. 
// Hardcoded for the example. 
Loader::Register('Core.Controls', '/controls'); 

// And then at some other point: 
Loader::Include('Core.Controls.Control'); 

Por supuesto, este ejemplo es lo mínimo que hace algo útil, pero se puede ver lo que te permite hacer

Disculpas si he cometido errores pequeños, estoy escribiendo esto como voy. :)

6

Solía ​​empezar todo mi archivo php con:

include_once('init.php'); 

Luego, en ese archivo me require_once todos los demás archivos que necesitan ser requerido, como functions.php por ejemplo, o globals.php donde declararía todas las variables globales o constantes. De esta manera, solo tiene que editar toda su configuración en un solo lugar.

+3

para que esto sea aún más fácil de mantener, puede definir la ruta al archivo init (o config, como generalmente los llamo) como una variable de entorno. No importa cuán profunda sea la estructura de directorios de la aplicación, cada archivo puede importar '$ _ENV ['my_app_config']' y no tener que preocuparse por cosas como 'include_once ('../../../ init.php ') '. –

Cuestiones relacionadas