Traté de hace un autoloader que usara Namespaces. Usando paths independientemente del SO. Usando el SPL Stack para autoloaders. Funcionara con include_path's. Y que fuese algo personalizable o independiente.
Hice la estructura de directorios:
application\
-library\
--core\
---Test.php
--AutoLoader.php
public\
-index.php
Objetivo: La autocarga de la clase Test.php desde index.php con Namespaces que tengan una relación 1:1 con la estructura de directorios.
Sin más el código de los 3 archivos:
(application\library\Autoloader.php)
Código PHP:
(application\library\core\Test.php)Ver original
<?php namespace Library { class AutoLoader { private $autoloader; private $path; private $ext; public function __construct($autoloader = "defaultLoader", $path = null, $ext = ".php") { $this->setAutoloader($autoloader); } $this->setPath($path); } $this->setExt($ext); } } // include_path Path Setter & Getter public function setPath($param) { $this->path = $param; } public function getPath() { return $this->path; } } // SPL Extension Setter & Getter public function setExt($param) { $this->ext = $param; } public function getExt() { return $this->ext; } } // Concrete autoloader Setter & Getter public function setAutoloader($param) { $this->autoloader = $param; } public function getAutoloader() { return $this->autoloader; } } // Callback function of spl_autoload_register public function autoloader($className) { $className = ltrim($className, __NAMESPACE__ . '\\'); // We cut the string to reflect the route that truly maps with the namespace defined in this class with the filepath. $this->{$this->autoloader}($className); } public function concreteLoader($className) { require_once '\\zf\\ZendFramework-1.11.4\\library\\' . $className . '.php'; // Windows Based Concrete Autoloader (SO DS Dependent) - Ignoring the use of the include_path cause its an absolute path. } // C:\zf\ZendFramework-1.11.4\library\ public function defaultLoader($className) { require_once $className . '.php'; // Direct require or looking include_path paths. } } } ?>
Código PHP:
Ver original
<?php namespace Library\Core { class Test { public function __construct() { echo "La clase " . __CLASS__ . " se ha ejecutado correctamente."; } } } ?>
(public\index.php)
Código PHP:
Ver original
<?php require '..\Application\Library\AutoLoader.php'; // Cargamos el autoloader $loader = new Library\AutoLoader(); $test = new Library\Core\test(); ?>