Added PSR-4 Autoloader

This commit is contained in:
Gabriel Bull 2014-03-02 13:11:33 -05:00
parent d5e55e7c4b
commit 6f2297ea9a
2 changed files with 36 additions and 2 deletions

View File

@ -31,9 +31,13 @@ if (!defined('PHPWORD_BASE_PATH')) {
/** /**
* Class PHPWord_Autoloader * Class PHPWord_Autoloader
*
* TODO: remove legacy autoloader once everything is moved to namespaces
*/ */
class PHPWord_Autoloader class PHPWord_Autoloader
{ {
const PREFIX = 'PHPWord';
/** /**
* Register the autoloader * Register the autoloader
* *
@ -41,7 +45,8 @@ class PHPWord_Autoloader
*/ */
public static function register() public static function register()
{ {
spl_autoload_register(array('PHPWord_Autoloader', 'load')); spl_autoload_register(array('PHPWord_Autoloader', 'load')); // Legacy
spl_autoload_register(array(new self, 'autoload')); // PSR-4
} }
/** /**
@ -60,4 +65,21 @@ class PHPWord_Autoloader
return null; return null;
} }
/**
* Autoloader
*
* @param string
*/
public static function autoload($class)
{
$prefixLength = strlen(self::PREFIX);
if (0 === strncmp(self::PREFIX, $class, $prefixLength)) {
$file = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, $prefixLength));
$file = realpath(__DIR__ . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php');
if (file_exists($file)) {
require_once $file;
}
}
}
} }

View File

@ -3,6 +3,7 @@ namespace PHPWord\Tests;
use PHPUnit_Framework_TestCase; use PHPUnit_Framework_TestCase;
use PHPWord_Autoloader; use PHPWord_Autoloader;
use PHPWord_Autoloader as Autoloader;
class AutoloaderTest extends PHPUnit_Framework_TestCase class AutoloaderTest extends PHPUnit_Framework_TestCase
{ {
@ -10,11 +11,22 @@ class AutoloaderTest extends PHPUnit_Framework_TestCase
{ {
PHPWord_Autoloader::register(); PHPWord_Autoloader::register();
$this->assertContains(array('PHPWord_Autoloader', 'load'), spl_autoload_functions()); $this->assertContains(array('PHPWord_Autoloader', 'load'), spl_autoload_functions());
$this->assertContains(array('PHPWord_Autoloader', 'autoload'), spl_autoload_functions());
} }
public function testAutoload() public function testAutoloadLegacy()
{ {
$this->assertNull(PHPWord_Autoloader::load('Foo'), 'PHPWord_Autoloader::load() is trying to load classes outside of the PHPWord namespace'); $this->assertNull(PHPWord_Autoloader::load('Foo'), 'PHPWord_Autoloader::load() is trying to load classes outside of the PHPWord namespace');
$this->assertTrue(PHPWord_Autoloader::load('PHPWord'), 'PHPWord_Autoloader::load() failed to autoload the PHPWord class'); $this->assertTrue(PHPWord_Autoloader::load('PHPWord'), 'PHPWord_Autoloader::load() failed to autoload the PHPWord class');
} }
public function testAutoload()
{
$declared = get_declared_classes();
$declaredCount = count($declared);
Autoloader::autoload('Foo');
$this->assertEquals($declaredCount, count(get_declared_classes()), 'PHPWord\\Autoloader::autoload() is trying to load classes outside of the PHPWord namespace');
Autoloader::autoload('PHPWord\\Exceptions\\InvalidStyleException'); // TODO change this class to the main PHPWord class when it is namespaced
$this->assertTrue(in_array('PHPWord\\Exceptions\\InvalidStyleException', get_declared_classes()), 'PHPWord\\Autoloader::autoload() failed to autoload the PHPWord\\Exceptions\\InvalidStyleException class');
}
} }