From dcffadb6c40c27894fda14f3209ef3426d8cadac Mon Sep 17 00:00:00 2001 From: Kris Wallsmith Date: Fri, 11 Mar 2011 11:22:33 -0800 Subject: [PATCH 1/3] [ClassLoader] added a check before trimming the leading \ --- src/Symfony/Component/ClassLoader/UniversalClassLoader.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/ClassLoader/UniversalClassLoader.php b/src/Symfony/Component/ClassLoader/UniversalClassLoader.php index 822023705f..12bddc3078 100644 --- a/src/Symfony/Component/ClassLoader/UniversalClassLoader.php +++ b/src/Symfony/Component/ClassLoader/UniversalClassLoader.php @@ -182,7 +182,9 @@ class UniversalClassLoader */ public function loadClass($class) { - $class = ltrim($class, '\\'); + if ('\\' == $class[0]) { + $class = substr($class, 1); + } if (false !== ($pos = strrpos($class, '\\'))) { // namespaced class name From 757e4ea4d6eb3147e6729e4b22af1913455d449d Mon Sep 17 00:00:00 2001 From: Kris Wallsmith Date: Fri, 11 Mar 2011 11:23:38 -0800 Subject: [PATCH 2/3] [ClassLoader] created protected findFile() method to allow creating a cache layer via inheritance --- .../ClassLoader/UniversalClassLoader.php | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Symfony/Component/ClassLoader/UniversalClassLoader.php b/src/Symfony/Component/ClassLoader/UniversalClassLoader.php index 12bddc3078..5f14866b14 100644 --- a/src/Symfony/Component/ClassLoader/UniversalClassLoader.php +++ b/src/Symfony/Component/ClassLoader/UniversalClassLoader.php @@ -181,12 +181,26 @@ class UniversalClassLoader * @param string $class The name of the class */ public function loadClass($class) + { + if ($file = $this->findFile($class)) { + require $file; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|null The path, if found + */ + protected function findFile($class) { if ('\\' == $class[0]) { $class = substr($class, 1); } - if (false !== ($pos = strrpos($class, '\\'))) { + if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $namespace = substr($class, 0, $pos); foreach ($this->namespaces as $ns => $dirs) { @@ -195,8 +209,7 @@ class UniversalClassLoader $className = substr($class, $pos + 1); $file = $dir.DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, $namespace).DIRECTORY_SEPARATOR.str_replace('_', DIRECTORY_SEPARATOR, $className).'.php'; if (file_exists($file)) { - require $file; - return; + return $file; } } } @@ -205,8 +218,7 @@ class UniversalClassLoader foreach ($this->namespaceFallback as $dir) { $file = $dir.DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, $class).'.php'; if (file_exists($file)) { - require $file; - return; + return $file; } } } else { @@ -216,8 +228,7 @@ class UniversalClassLoader if (0 === strpos($class, $prefix)) { $file = $dir.DIRECTORY_SEPARATOR.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php'; if (file_exists($file)) { - require $file; - return; + return $file; } } } @@ -226,8 +237,7 @@ class UniversalClassLoader foreach ($this->prefixFallback as $dir) { $file = $dir.DIRECTORY_SEPARATOR.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php'; if (file_exists($file)) { - require $file; - return; + return $file; } } } From 441a15420333de9c8d8338511214f819949b5311 Mon Sep 17 00:00:00 2001 From: Kris Wallsmith Date: Fri, 11 Mar 2011 11:28:05 -0800 Subject: [PATCH 3/3] [ClassLoader] added an apc class loader --- .../ClassLoader/ApcUniversalClassLoader.php | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php diff --git a/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php b/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php new file mode 100644 index 0000000000..9cb1283c44 --- /dev/null +++ b/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ClassLoader; + +require_once __DIR__.'/UniversalClassLoader.php'; + +/** + * Class loader utilizing APC to remember where files are. + * + * @author Kris Wallsmith + */ +class ApcUniversalClassLoader extends UniversalClassLoader +{ + private $prefix; + + /** + * Constructor. + * + * @param string $prefix A prefix to create a namespace in APC + */ + public function __construct($prefix) + { + $this->prefix = $prefix; + } + + protected function findFile($class) + { + if (false === $file = apc_fetch($this->prefix.$class)) { + apc_store($this->prefix.$class, $file = parent::findFile($class)); + } + + return $file; + } +}