Rewritten to register our own __autoload method, loadClasses() renamed to scanClassPath()
authorRoland Häder <roland@mxchange.org>
Fri, 13 Mar 2009 13:28:54 +0000 (13:28 +0000)
committerRoland Häder <roland@mxchange.org>
Fri, 13 Mar 2009 13:28:54 +0000 (13:28 +0000)
inc/classes.php
inc/includes.php
inc/loader/class_ClassLoader.php

index 980d71b..b139dcf 100644 (file)
@@ -33,7 +33,7 @@ $lowerClasses = array(
 foreach ($lowerClasses as $className) {
        // Try to load the framework classes
        try {
-               ClassLoader::getInstance()->loadClasses(sprintf("inc/classes/%s/", $className));
+               ClassLoader::getInstance()->scanClassPath(sprintf("inc/classes/%s/", $className));
        } catch (PathIsNoDirectoryException $e) {
                ApplicationEntryPoint::app_die(sprintf("[Main:] Could not load framework classes from path <span class=\"exception_data\">%s</span> for the follwing reason: <span class=\"exception_reason\">%s</span>",
                        $className
index b5e6acd..246a532 100644 (file)
@@ -61,16 +61,8 @@ $application = preg_replace('/([^a-z0-9_-])+/i', "", $application);
 // Set the application name for later usage
 $cfg->setConfigEntry('app_name', $application);
 
-/**
- * Autoload-function
- *
- * @param      $className      Name of the class to load
- * @return     void
- */
-function __autoload ($className) {
-       // Try to include this class
-       ClassLoader::getInstance()->includeClass($className);
-}
+// Register auto-load function with the SPL
+spl_autoload_register("ClassLoader::autoLoad");
 
 /**
  * Is the devel package included?
@@ -79,8 +71,8 @@ if (is_dir(sprintf("%sdevel", $cfg->readConfig('base_path')))) {
        /**
         * Load all development includes
         */
-       ClassLoader::getInstance()->loadClasses('devel');
-}
+       ClassLoader::getInstance()->scanClassPath('devel');
+} // END - if
 
 // [EOF]
 ?>
index e15f52d..aa592e1 100644 (file)
@@ -22,6 +22,9 @@
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  *
  * ----------------------------------
+ * 1.3
+ *  - Constructor is now empty and factory method 'createClassLoader' is created
+ *  - renamed loadClasses to scanClassPath
  * 1.2
  *  - ClassLoader rewritten to PHP SPL's own RecursiveIteratorIterator class
  * 1.1
@@ -61,16 +64,6 @@ class ClassLoader {
         */
        private $suffix = ".php";
 
-       /**
-        * Length of the suffix. Will be overwritten later.
-        */
-       private $suffixLen = 0;
-
-       /**
-        * Length of the prefix. Will be overwritten later.
-        */
-       private $prefixLen = 0;
-
        /**
         * A list for directory names (no leading/trailing slashes!) which not be scanned by the path scanner
         * @see scanLocalPath
@@ -108,12 +101,22 @@ class ClassLoader {
        private $total = 0;
 
        /**
-        * The *public* constructor
+        * The protected constructor. Please use the factory method below, or use
+        * getInstance() for singleton
         *
-        * @param               $cfgInstance            Configuration class instance
         * @return      void
         */
-       public function __construct (FrameworkConfiguration $cfgInstance) {
+       protected function __construct () {
+               // Is Currently empty
+       }
+
+       /**
+        * Our renamed factory method
+        *
+        * @param       $cfgInstance    Configuration class instance
+        * @return      void
+        */
+       public final static function createClassLoader (FrameworkConfiguration $cfgInstance) {
                // Set configuration instance
                $this->cfgInstance = $cfgInstance;
 
@@ -127,10 +130,6 @@ class ClassLoader {
                $this->suffix = $cfgInstance->readConfig('class_suffix');
                $this->prefix = $cfgInstance->readConfig('class_prefix');
 
-               // Estimate length of prefix and suffix for substr() function (cache)
-               $this->suffixLen = strlen($this->suffix);
-               $this->prefixLen = strlen($this->prefix);
-
                // Set own instance
                self::$selfInstance = $this;
 
@@ -159,6 +158,33 @@ class ClassLoader {
                } // END - if
        }
 
+       /**
+        * Autoload-function
+        *
+        * @param       $className      Name of the class to load
+        * @return      void
+        */
+       public static function autoLoad ($className) {
+               // Try to include this class
+               self::getInstance()->includeClass($className);
+       }
+
+       /**
+        * Getter for an instance of this class
+        *
+        * @return      $selfInstance           An instance of this class
+        */
+       public final static function getInstance () {
+               // Is the instance there?
+               if (is_null(self::$selfInstance)) {
+                       // Get a new one
+                       self::$selfInstance = ClassLoader::createClassLoader(FrameworkConfiguration::getInstance());
+               } // END - if
+
+               // Return the instance
+               return self::$selfInstance;
+       }
+
        /**
         * The destructor makes it sure all caches got flushed
         *
@@ -190,19 +216,20 @@ class ClassLoader {
        }
 
        /**
-        * Getter for an instance of this class
+        * Fall-back method. Please replace loadClasses() with scanClassPath() !
         *
-        * @return      $selfInstance           An instance of this class
+        * @param       $basePath               The relative base path to 'base_path' constant for all classes
+        * @param       $ignoreList             An optional list (array forced) of directory and file names which shall be ignored
+        * @return      void
+        * @deprecated
+        * @todo        Rewrite your apps to scanClassPath()
         */
-       public final static function getInstance () {
-               // Is the instance there?
-               if (is_null(self::$selfInstance)) {
-                       // Get a new one
-                       self::$selfInstance = new ClassLoader(FrameworkConfiguration::getInstance());
-               } // END - if
+       public function loadClasses ($basePath, array $ignoreList = array() ) {
+               // This outputs an ugly message because you need to change to scanClassPath
+               print __METHOD__." is deprecated. Use scanClassPath() to make this warning go away.<br />\n";
 
-               // Return the instance
-               return self::$selfInstance;
+               // Call our new method
+               $this->scanClassPath($basePath, $ignoreList);
        }
 
        /**
@@ -212,7 +239,7 @@ class ClassLoader {
         * @param       $ignoreList             An optional list (array forced) of directory and file names which shall be ignored
         * @return      void
         */
-       public function loadClasses ($basePath, array $ignoreList = array() ) {
+       public function scanClassPath ($basePath, array $ignoreList = array() ) {
                // Is a list has been restored from cache, don't read it again
                if ($this->listCached === true) {
                        // Abort here
@@ -253,7 +280,7 @@ class ClassLoader {
 
                        // Is this file wanted?
                        //* DEBUG: */ echo "FOUND:{$fileName}<br />\n";
-                       if ((!in_array($fileName, $this->ignoreList)) && (substr($fileName, 0, $this->prefixLen) == $this->prefix) && (substr($fileName, -$this->suffixLen, $this->suffixLen) == $this->suffix)) {
+                       if ((!in_array($fileName, $this->ignoreList)) && (substr($fileName, 0, strlen($this->prefix)) == $this->prefix) && (substr($fileName, -strlen($this->suffix), strlen($this->suffix)) == $this->suffix)) {
                                // Get the FQFN and add it to our class list
                                $fqfn = $entry->getRealPath();
                                //* DEBUG: */ echo "ADD: {$fileName}<br />\n";
@@ -273,21 +300,18 @@ class ClassLoader {
 
                // Set new prefix (temporary!)
                $this->prefix = "config-";
-               $this->prefixLen = strlen($this->prefix);
 
                // Set base directory
                $basePath = sprintf("%sinc/config/", $this->cfgInstance->readConfig('base_path'));
 
                // Load all classes from the config directory
-               $this->loadClasses($basePath);
+               $this->scanClassPath($basePath);
 
                // Include these extra configs now
                $this->includeExtraConfigs();
 
                // Set the prefix back
                $this->prefix = $oldPrefix;
-               $this->prefixLen = strlen($this->prefix);
-
        }
 
        /**
@@ -335,7 +359,7 @@ class ClassLoader {
                // Run through all class names (should not be much)
                foreach ($this->classes as $fileName => $fqfn) {
                        // Is this a config?
-                       if (substr($fileName, 0, $this->prefixLen) == $this->prefix) {
+                       if (substr($fileName, 0, strlen($this->prefix)) == $this->prefix) {
                                // Then include it
                                require($fqfn);