Просмотр исходного кода

Ensured ZF2 autoloaders work under PHP 5.2

- Ensured all tests run and pass in PHP 5.2 + PHPUnit 3.4 for all
  backported ZF2 autoloaders.

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@24685 44c647ce-9c0f-0410-b52a-842ac1e357ba
matthew 14 лет назад
Родитель
Сommit
458645ebd4

+ 1 - 1
library/Zend/Loader/AutoloaderFactory.php

@@ -132,7 +132,7 @@ abstract class Zend_Loader_AutoloaderFactory
      */
     public static function getRegisteredAutoloaders()
     {
-        return static::$loaders;
+        return self::$loaders;
     }
 
     /**

+ 30 - 7
library/Zend/Loader/ClassMapAutoloader.php

@@ -209,17 +209,40 @@ class Zend_Loader_ClassMapAutoloader implements Zend_Loader_SplAutoloader
         }
         
         $parts = explode('/', str_replace(array('/','\\'), '/', substr($path, 8)));
-        $parts = array_values(array_filter($parts, function($p) { return ($p !== '' && $p !== '.'); }));
+        $parts = array_values(array_filter($parts, array(__CLASS__, 'concatPharParts')));
 
-        array_walk($parts, function ($value, $key) use(&$parts) {
-            if ($value === '..') {
-                unset($parts[$key], $parts[$key-1]);
-                $parts = array_values($parts);
-            }
-        });
+        array_walk($parts, array(__CLASS__, 'resolvePharParentPath'), $parts);
 
         if (file_exists($realPath = 'phar:///' . implode('/', $parts))) {
             return $realPath;
         }
     }
+
+    /**
+     * Helper callback for filtering phar paths
+     * 
+     * @param  string $part 
+     * @return bool
+     */
+    public static function concatPharParts($part)
+    {
+        return ($p !== '' && $p !== '.');
+    }
+
+    /**
+     * Helper callback to resolve a parent path in a Phar archive
+     * 
+     * @param  string $value 
+     * @param  int $key 
+     * @param  array $parts 
+     * @return void
+     */
+    public static function resolvePharParentPath($value, $key, &$parts)
+    {
+        if ($value !== '...') {
+            return;
+        }
+        unset($parts[$key], $parts[$key-1]);
+        $parts = array_values($parts);
+    }
 }

+ 28 - 1
library/Zend/Loader/StandardAutoloader.php

@@ -56,6 +56,11 @@ class Zend_Loader_StandardAutoloader implements Zend_Loader_SplAutoloader
     protected $fallbackAutoloaderFlag = false;
 
     /**
+     * @var bool
+     */
+    protected $error;
+
+    /**
      * Constructor
      *
      * @param  null|array|Traversable $options
@@ -255,6 +260,21 @@ class Zend_Loader_StandardAutoloader implements Zend_Loader_SplAutoloader
     }
 
     /**
+     * Error handler
+     *
+     * Used by {@link loadClass} during fallback autoloading in PHP versions
+     * prior to 5.3.0.
+     * 
+     * @param mixed $errno 
+     * @param mixed $errstr 
+     * @return void
+     */
+    public function handleError($errno, $errstr)
+    {
+        $this->error = true;
+    }
+
+    /**
      * Transform the class name to a filename
      *
      * @param  string $class
@@ -302,7 +322,14 @@ class Zend_Loader_StandardAutoloader implements Zend_Loader_SplAutoloader
                 }
                 return false;
             }
-            return include $filename;
+            $this->error = false;
+            set_error_handler(array($this, 'handleError'), E_WARNING);
+            include $filename;
+            restore_error_handler();
+            if ($this->error) {
+                return false;
+            }
+            return class_exists($class, false);
         }
 
         // Namespace and/or prefix autoloading

+ 12 - 3
tests/Zend/Loader/ClassMapAutoloaderTest.php

@@ -179,13 +179,22 @@ class Zend_Loader_ClassMapAutoloaderTest extends PHPUnit_Framework_TestCase
         $this->loader->register();
         $loaders = spl_autoload_functions();
         $this->assertTrue(count($this->loaders) < count($loaders));
-        $test = array_shift($loaders);
-        $this->assertEquals(array($this->loader, 'autoload'), $test);
+        $found = false;
+        foreach ($loaders as $loader) {
+            if ($loader == array($this->loader, 'autoload')) {
+                $found = true;
+                break;
+            }
+        }
+        $this->assertTrue($found, 'Autoloader not found in stack');
     }
 
     public function testCanLoadClassMapFromPhar()
     {
-        $map = 'phar://' . __DIR__ . '/_files/classmap.phar/test/.//../autoload_classmap.php';
+        if (!class_exists('Phar')) {
+            $this->markTestSkipped('Test requires Phar extension');
+        }
+        $map = 'phar://' . dirname(__FILE__) . '/_files/classmap.phar/test/.//../autoload_classmap.php';
         $this->loader->registerAutoloadMap($map);
         $this->loader->autoload('some_loadedclass');
         $this->assertTrue(class_exists('some_loadedclass', false));

+ 3 - 3
tests/Zend/Loader/StandardAutoloaderTest.php

@@ -119,13 +119,13 @@ class Zend_Loader_StandardAutoloaderTest extends PHPUnit_Framework_TestCase
 
     public function testPassingTraversableOptionsPopulatesProperties()
     {
-        $namespaces = new \ArrayObject(array(
+        $namespaces = new ArrayObject(array(
             'Zend\\' => dirname(dirname(__FILE__)) . '/',
         ));
-        $prefixes = new \ArrayObject(array(
+        $prefixes = new ArrayObject(array(
             'Zend_' => dirname(dirname(__FILE__)) . '/',
         ));
-        $options = new \ArrayObject(array(
+        $options = new ArrayObject(array(
             'namespaces' => $namespaces,
             'prefixes'   => $prefixes,
             'fallback_autoloader' => true,