1
0
mirror of synced 2024-12-13 06:46:03 +03:00

[2.0] Small changes to ClassLoader and add basic unit test for it

This commit is contained in:
jwage 2009-02-17 22:30:13 +00:00
parent 554adc32a4
commit 9dfab03ee0
6 changed files with 79 additions and 31 deletions

View File

@ -16,47 +16,71 @@ namespace Doctrine\Common;
* *
* 3) DO NOT setCheckFileExists(true). Doing so is expensive in terms of performance. * 3) DO NOT setCheckFileExists(true). Doing so is expensive in terms of performance.
* 4) Use an opcode-cache (i.e. APC) (STRONGLY RECOMMENDED). * 4) Use an opcode-cache (i.e. APC) (STRONGLY RECOMMENDED).
* *
* @since 2.0 * @since 2.0
* @author romanb <roman@code-factory.org> * @author Roman S. Borschel <roman@code-factory.org>
*/ */
class ClassLoader class ClassLoader
{ {
private $_namespaceSeparator = '\\'; private
private $_fileExtension = '.php'; $_namespaceSeparator = '\\',
private $_checkFileExists = false; $_fileExtension = '.php',
private $_basePaths = array(); $_checkFileExists = false,
$_basePaths = array();
/**
* Constructor registers the autoloader automatically
*/
public function __construct() public function __construct()
{ {
spl_autoload_register(array($this, 'loadClass'));
} }
/**
* Set check file exists
*
* @param boolean $bool
* @return void
*/
public function setCheckFileExists($bool) public function setCheckFileExists($bool)
{ {
$this->_checkFileExists = $bool; $this->_checkFileExists = $bool;
} }
/**
* Set class file extension
*
* @param string $extension
* @return void
*/
public function setClassFileExtension($extension) public function setClassFileExtension($extension)
{ {
$this->_fileExtension = $extension; $this->_fileExtension = $extension;
} }
/**
* Set namespace separator
*
* @param string $separator
* @return void
*/
public function setNamespaceSeparator($separator) public function setNamespaceSeparator($separator)
{ {
$this->_namespaceSeparator = $separator; $this->_namespaceSeparator = $separator;
} }
/** /**
* Sets a static base path for classes with a certain prefix that is prepended * Sets a static base path for classes with a certain prefix that is prepended
* to the path derived from the class itself. * to the path derived from the class itself.
* *
* @param string $classPrefix
* @param string $basePath * @param string $basePath
*/ */
public function setBasePath($classPrefix, $basePath) public function setBasePath($classPrefix, $basePath)
{ {
$this->_basePaths[$classPrefix] = $basePath; $this->_basePaths[$classPrefix] = $basePath;
} }
/** /**
* Loads the given class or interface. * Loads the given class or interface.
* *
@ -86,20 +110,7 @@ class ClassLoader
} }
require $class; require $class;
return true; return true;
} }
}
/**
* Registers this class loader using spl_autoload_register().
*
* @return void
*/
public function register()
{
spl_autoload_register(array($this, 'loadClass'));
}
}
?>

View File

@ -22,6 +22,7 @@ class AllTests
$suite = new \Doctrine\Tests\DoctrineTestSuite('Doctrine Common Tests'); $suite = new \Doctrine\Tests\DoctrineTestSuite('Doctrine Common Tests');
$suite->addTestSuite('Doctrine\Tests\Common\EventManagerTest'); $suite->addTestSuite('Doctrine\Tests\Common\EventManagerTest');
$suite->addTestSuite('Doctrine\Tests\Common\ClassLoaderTest');
$suite->addTest(Collections\AllTests::suite()); $suite->addTest(Collections\AllTests::suite());

View File

@ -0,0 +1,29 @@
<?php
namespace Doctrine\Tests\Common;
use Doctrine\Common\ClassLoader;
class ClassLoaderTest extends \Doctrine\Tests\DoctrineTestCase
{
public function testCustomFileExtensionAndNamespaceSeparator()
{
$classLoader = new \Doctrine\Common\ClassLoader();
$classLoader->setBasePath('ClassLoaderTest', __DIR__);
$classLoader->setClassFileExtension('.class.php');
$classLoader->setNamespaceSeparator('_');
$this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true);
$this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true);
}
public function testClassLoaderCheckFileExists()
{
$classLoader = new \Doctrine\Common\ClassLoader();
$classLoader->setBasePath('ClassLoaderTest', __DIR__);
$classLoader->setCheckFileExists(true);
// This would return a fatal error without check file exists true
$this->assertEquals($classLoader->loadClass('SomeInvalidClass'), false);
}
}

View File

@ -0,0 +1,5 @@
<?php
class ClassLoaderTest_ClassA
{
}

View File

@ -0,0 +1,5 @@
<?php
class ClassLoaderTest_ClassB
{
}

View File

@ -9,9 +9,6 @@ require_once 'PHPUnit/TextUI/TestRunner.php';
require_once '../lib/Doctrine/Common/ClassLoader.php'; require_once '../lib/Doctrine/Common/ClassLoader.php';
$classLoader = new \Doctrine\Common\ClassLoader(); $classLoader = new \Doctrine\Common\ClassLoader();
// checking for existance should not be necessary, remove as soon as possible
//$classLoader->setCheckFileExists(true);
$classLoader->register();
$modelDir = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'models'; $modelDir = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'models';
set_include_path( set_include_path(