Revision: 1230
Author: christian.wuerker
Date: Thu May 28 07:50:17 2015 UTC
Log: Added PSR autoloader classes.
https://code.google.com/p/cmclasses/source/detail?r=1230
Added:
/branches/0.8.1/src/FS/Autoloader/Psr0.php
/branches/0.8.1/src/FS/Autoloader/Psr4.php
Modified:
/branches/0.8.1/autoload.php
=======================================
--- /dev/null
+++ /branches/0.8.1/src/FS/Autoloader/Psr0.php Thu May 28 07:50:17 2015 UTC
@@ -0,0 +1,159 @@
+<?php
+namespace CeusMedia\Common\FS\Autoloader;
+
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many
individuals
+ * and is licensed under the MIT license. For more information, see
+ * <
http://www.doctrine-project.org>.
+ */
+
+/**
+ * SplClassLoader implementation that implements the technical
interoperability
+ * standards for PHP 5.3 namespaces and class names.
+ *
+ *
http://groups.google.com/group/php-standards/web/psr-0-final-proposal?pli=1
+ *
+ * // Example which loads classes for the Doctrine Common package in
the
+ * // Doctrine\Common namespace.
+ * $classLoader = new
SplClassLoader('Doctrine\Common', '/path/to/doctrine');
+ * $classLoader->register();
+ *
+ * @license
http://www.opensource.org/licenses/mit-license.html MIT
License
+ * @author Jonathan H. Wage <
jon...@gmail.com>
+ * @author Roman S. Borschel <
ro...@code-factory.org>
+ * @author Matthew Weier O'Phinney <
mat...@zend.com>
+ * @author Kris Wallsmith <
kris.wa...@gmail.com>
+ * @author Fabien Potencier <
fabien.p...@symfony-project.org>
+ */
+class Psr0
+{
+ private $_fileExtension = '.php';
+ private $_namespace;
+ private $_includePath;
+ private $_namespaceSeparator = '\\';
+
+ /**
+ * Creates a new <tt>SplClassLoader</tt> that loads classes of the
+ * specified namespace.
+ *
+ * @param string $ns The namespace to use.
+ */
+ public function __construct($ns = null, $includePath = null)
+ {
+ $this->_namespace = $ns;
+ $this->_includePath = $includePath;
+ }
+
+ /**
+ * Sets the namespace separator used by classes in the namespace of
this class loader.
+ *
+ * @param string $sep The separator to use.
+ */
+ public function setNamespaceSeparator($sep)
+ {
+ $this->_namespaceSeparator = $sep;
+ }
+
+ /**
+ * Gets the namespace seperator used by classes in the namespace of
this class loader.
+ *
+ * @return void
+ */
+ public function getNamespaceSeparator()
+ {
+ return $this->_namespaceSeparator;
+ }
+
+ /**
+ * Sets the base include path for all class files in the namespace of
this class loader.
+ *
+ * @param string $includePath
+ */
+ public function setIncludePath($includePath)
+ {
+ $this->_includePath = $includePath;
+ }
+
+ /**
+ * Gets the base include path for all class files in the namespace of
this class loader.
+ *
+ * @return string $includePath
+ */
+ public function getIncludePath()
+ {
+ return $this->_includePath;
+ }
+
+ /**
+ * Sets the file extension of class files in the namespace of this
class loader.
+ *
+ * @param string $fileExtension
+ */
+ public function setFileExtension($fileExtension)
+ {
+ $this->_fileExtension = $fileExtension;
+ }
+
+ /**
+ * Gets the file extension of class files in the namespace of this
class loader.
+ *
+ * @return string $fileExtension
+ */
+ public function getFileExtension()
+ {
+ return $this->_fileExtension;
+ }
+
+ /**
+ * Installs this class loader on the SPL autoload stack.
+ */
+ public function register()
+ {
+ spl_autoload_register(array($this, 'loadClass'));
+ }
+
+ /**
+ * Uninstalls this class loader from the SPL autoloader stack.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $className The name of the class to load.
+ * @return void
+ */
+ public function loadClass($className)
+ {
+ if (null === $this->_namespace ||
$this->_namespace.$this->_namespaceSeparator === substr($className, 0,
strlen($this->_namespace.$this->_namespaceSeparator))) {
+ $fileName = '';
+ $namespace = '';
+ if (false !== ($lastNsPos = strripos($className,
$this->_namespaceSeparator))) {
+ $namespace = substr($className, 0, $lastNsPos);
+ $className = substr($className, $lastNsPos + 1);
+ $fileName = str_replace($this->_namespaceSeparator,
DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
+ }
+ $fileName .= str_replace('_', DIRECTORY_SEPARATOR,
$className) . $this->_fileExtension;
+ $filePath = ($this->_includePath !== null ?
$this->_includePath . DIRECTORY_SEPARATOR : '') . $fileName;
+
+ if (file_exists($filePath)) {
+ require $filePath;
+ }
+ }
+ }
+}
=======================================
--- /dev/null
+++ /branches/0.8.1/src/FS/Autoloader/Psr4.php Thu May 28 07:50:17 2015 UTC
@@ -0,0 +1,188 @@
+<?php
+namespace CeusMedia\Common\FS;
+
+/**
+ * An example of a general-purpose implementation that includes the
optional
+ * functionality of allowing multiple base directories for a single
namespace
+ * prefix.
+ *
+ * Given a foo-bar package of classes in the file system at the following
+ * paths ...
+ *
+ * /path/to/packages/foo-bar/
+ * src/
+ * Baz.php # Foo\Bar\Baz
+ * Qux/
+ * Quux.php # Foo\Bar\Qux\Quux
+ * tests/
+ * BazTest.php # Foo\Bar\BazTest
+ * Qux/
+ * QuuxTest.php # Foo\Bar\Qux\QuuxTest
+ *
+ * ... add the path to the class files for the \Foo\Bar\ namespace prefix
+ * as follows:
+ *
+ * <?php
+ * // instantiate the loader
+ * $loader = new \Example\Psr4AutoloaderClass;
+ *
+ * // register the autoloader
+ * $loader->register();
+ *
+ * // register the base directories for the namespace prefix
+ * $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src');
+ *
$loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests');
+ *
+ * The following line would cause the autoloader to attempt to load the
+ * \Foo\Bar\Qux\Quux class from /path/to/packages/foo-bar/src/Qux/Quux.php:
+ *
+ * <?php
+ * new \Foo\Bar\Qux\Quux;
+ *
+ * The following line would cause the autoloader to attempt to load the
+ * \Foo\Bar\Qux\QuuxTest class from
/path/to/packages/foo-bar/tests/Qux/QuuxTest.php:
+ *
+ * <?php
+ * new \Foo\Bar\Qux\QuuxTest;
+ */
+class Psr4AutoloaderClass
+{
+ /**
+ * An associative array where the key is a namespace prefix and the
value
+ * is an array of base directories for classes in that namespace.
+ *
+ * @var array
+ */
+ protected $prefixes = array();
+
+ /**
+ * Register loader with SPL autoloader stack.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ spl_autoload_register(array($this, 'loadClass'));
+ }
+
+ /**
+ * Adds a base directory for a namespace prefix.
+ *
+ * @param string $prefix The namespace prefix.
+ * @param string $base_dir A base directory for class files in the
+ * namespace.
+ * @param bool $prepend If true, prepend the base directory to the
stack
+ * instead of appending it; this causes it to be searched first rather
+ * than last.
+ * @return void
+ */
+ public function addNamespace($prefix, $base_dir, $prepend = false)
+ {
+ // normalize namespace prefix
+ $prefix = trim($prefix, '\\') . '\\';
+
+ // normalize the base directory with a trailing separator
+ $base_dir = rtrim($base_dir, DIRECTORY_SEPARATOR) . '/';
+
+ // initialize the namespace prefix array
+ if (isset($this->prefixes[$prefix]) === false) {
+ $this->prefixes[$prefix] = array();
+ }
+
+ // retain the base directory for the namespace prefix
+ if ($prepend) {
+ array_unshift($this->prefixes[$prefix], $base_dir);
+ } else {
+ array_push($this->prefixes[$prefix], $base_dir);
+ }
+ }
+
+ /**
+ * Loads the class file for a given class name.
+ *
+ * @param string $class The fully-qualified class name.
+ * @return mixed The mapped file name on success, or boolean false on
+ * failure.
+ */
+ public function loadClass($class)
+ {
+ // the current namespace prefix
+ $prefix = $class;
+
+ // work backwards through the namespace names of the
fully-qualified
+ // class name to find a mapped file name
+ while (false !== $pos = strrpos($prefix, '\\')) {
+
+ // retain the trailing namespace separator in the prefix
+ $prefix = substr($class, 0, $pos + 1);
+
+ // the rest is the relative class name
+ $relative_class = substr($class, $pos + 1);
+
+ // try to load a mapped file for the prefix and relative class
+ $mapped_file = $this->loadMappedFile($prefix, $relative_class);
+ if ($mapped_file) {
+ return $mapped_file;
+ }
+
+ // remove the trailing namespace separator for the next
iteration
+ // of strrpos()
+ $prefix = rtrim($prefix, '\\');
+ }
+
+ // never found a mapped file
+ return false;
+ }
+
+ /**
+ * Load the mapped file for a namespace prefix and relative class.
+ *
+ * @param string $prefix The namespace prefix.
+ * @param string $relative_class The relative class name.
+ * @return mixed Boolean false if no mapped file can be loaded, or the
+ * name of the mapped file that was loaded.
+ */
+ protected function loadMappedFile($prefix, $relative_class)
+ {
+ // are there any base directories for this namespace prefix?
+ if (isset($this->prefixes[$prefix]) === false) {
+ return false;
+ }
+
+ // look through base directories for this namespace prefix
+ foreach ($this->prefixes[$prefix] as $base_dir) {
+
+ // replace the namespace prefix with the base directory,
+ // replace namespace separators with directory separators
+ // in the relative class name, append with .php
+ $file = $base_dir
+ . str_replace('\\', '/', $relative_class)
+ . '.php';
+
+ // if the mapped file exists, require it
+ if ($this->requireFile($file)) {
+ // yes, we're done
+ return $file;
+ }
+ }
+
+ // never found it
+ return false;
+ }
+
+ /**
+ * If a file exists, require it from the file system.
+ *
+ * @param string $file The file to require.
+ * @return bool True if the file exists, false if not.
+ */
+ protected function requireFile($file)
+ {
+print($file).PHP_EOL;
+ if (file_exists($file)) {
+ require $file;
+ return true;
+ }
+ return false;
+ }
+}
=======================================
--- /branches/0.8.1/autoload.php Sat May 23 07:13:27 2015 UTC
+++ /branches/0.8.1/autoload.php Thu May 28 07:50:17 2015 UTC
@@ -1,4 +1,33 @@
<?php
+
+$pathSrc = dirname(__FILE__) . "/src/";
+
+if (!defined('CMC_PATH')) {
+ define('CMC_PATH', $pathSrc);
+}
+
+/* PSR-0 */
+require_once $pathSrc . 'FS/Autoloader/Psr0.php';
+
+//$loader = new \CeusMedia\Common\FS\Autoloader\Psr0('CeusMedia\Common',
$pathSrc);
+$loader = new \CeusMedia\Common\FS\Autoloader\Psr0();
+//$loader = new FS_Autoloader_Psr0();
+$loader->setIncludePath($pathSrc);
+$loader->register();
+
+
+/* PSR-4 - use this for v0.9
+require_once $pathSrc . 'FS/Autoloader/Psr4.php';
+$loader = new \CeusMedia\Common\FS\Psr4AutoloaderClass;
+$loader->register();
+$loader->addNamespace('CeusMedia\Common', $pathSrc);
+*/
+
+class_exists('UI_DevOutput');
+return;
+
+
+
/* -- cmClasses AutoLoader -- */
if( !defined( 'CMC_PATH' ) )
define( 'CMC_PATH', dirname( __FILE__ )."/src/" );