X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=framework%2Floader%2Fclass_ClassLoader.php;h=9f78f969e5290aac1190fbbd873c367b22b08c17;hp=0560362015876308c5d86c846d46d652bb4f3634;hb=2eac7fa61bc152da2e962d55e3a44e56faa12f93;hpb=bcc4c93c61443966ab39195d81ff9ecd26068b94 diff --git a/framework/loader/class_ClassLoader.php b/framework/loader/class_ClassLoader.php index 05603620..9f78f969 100644 --- a/framework/loader/class_ClassLoader.php +++ b/framework/loader/class_ClassLoader.php @@ -3,9 +3,8 @@ namespace CoreFramework\Loader; // Import framework stuff +use CoreFramework\Bootstrap\FrameworkBootstrap; use CoreFramework\Configuration\FrameworkConfiguration; -use CoreFramework\EntryPoint\ApplicationEntryPoint; -use CoreFramework\Object\BaseFrameworkSystem; // Import SPL stuff use \InvalidArgumentException; @@ -86,19 +85,19 @@ class ClassLoader { private $ignoreList = array(); /** - * Debug this class loader? (TRUE = yes, FALSE = no) + * Debug this class loader? (true = yes, false = no) */ - private $debug = FALSE; + private $debug = false; /** * Whether the file list is cached */ - private $listCached = FALSE; + private $listCached = false; /** * Wethe class content has been cached */ - private $classesCached = FALSE; + private $classesCached = false; /** * Filename for the list cache @@ -118,7 +117,7 @@ class ClassLoader { /** * By default the class loader is strict with naming-convention check */ - private static $strictNamingConventionCheck = TRUE; + private static $strictNamingConvention = true; /** * Framework/application paths for classes, etc. @@ -158,14 +157,14 @@ class ClassLoader { } // END - if // Skip here if already cached - if ($this->listCached === FALSE) { + if ($this->listCached === false) { // Writes the cache file of our list away $cacheContent = json_encode($this->foundClasses); file_put_contents($this->listCacheFQFN, $cacheContent); } // END - if // Skip here if already cached - if ($this->classesCached === FALSE) { + if ($this->classesCached === false) { // Generate a full-cache of all classes $cacheContent = ''; foreach (array_keys($this->loadedClasses) as $fqfn) { @@ -208,7 +207,7 @@ class ClassLoader { $loaderInstance = self::getSelfInstance(); // Get config instance - $cfg = FrameworkConfiguration::getSelfInstance(); + $configInstance = FrameworkConfiguration::getSelfInstance(); // Load all classes foreach (self::$frameworkPaths as $shortPath) { @@ -216,26 +215,28 @@ class ClassLoader { //* NOISY-DEBUG: */ printf('[%s:%d]: shortPath=%s' . PHP_EOL, __METHOD__, __LINE__, $shortPath); // Generate full path from it - $pathName = realpath(sprintf( - '%s/framework/main/%s/', - $cfg->getConfigEntry('base_path'), - $shortPath + $realPathName = realpath(sprintf( + '%smain%s%s%s', + $configInstance->getConfigEntry('framework_base_path'), + DIRECTORY_SEPARATOR, + $shortPath, + DIRECTORY_SEPARATOR )); // Debug message - //* NOISY-DEBUG: */ printf('[%s:%d]: pathName=%s' . PHP_EOL, __METHOD__, __LINE__, $pathName); + //* NOISY-DEBUG: */ printf('[%s:%d]: realPathName=%s' . PHP_EOL, __METHOD__, __LINE__, $realPathName); - // Is it not FALSE and accessible? - if (is_bool($pathName)) { + // Is it not false and accessible? + if (is_bool($realPathName)) { // Skip this continue; - } elseif (!is_readable($pathName)) { + } elseif (!is_readable($realPathName)) { // @TODO Throw exception instead of break break; } // Try to load the framework classes - $loaderInstance->scanClassPath($pathName); + $loaderInstance->scanClassPath($realPathName); } // END - foreach // Trace message @@ -255,7 +256,7 @@ class ClassLoader { $loaderInstance = self::getSelfInstance(); // Get config instance - $cfg = FrameworkConfiguration::getSelfInstance(); + $configInstance = FrameworkConfiguration::getSelfInstance(); // Load all classes for the application foreach (self::$frameworkPaths as $shortPath) { @@ -264,9 +265,11 @@ class ClassLoader { // Create path name $pathName = realpath(sprintf( - '%s/%s/%s', - $cfg->getConfigEntry('application_path'), - $cfg->getConfigEntry('app_name'), + '%s%s%s%s%s', + $configInstance->getConfigEntry('application_base_path'), + DIRECTORY_SEPARATOR, + $configInstance->getConfigEntry('detected_app_name'), + DIRECTORY_SEPARATOR, $shortPath )); @@ -294,27 +297,34 @@ class ClassLoader { //* NOISY-DEBUG: */ printf('[%s:%d]: CALLED!' . PHP_EOL, __METHOD__, __LINE__); // Get config instance - $cfg = FrameworkConfiguration::getSelfInstance(); + $configInstance = FrameworkConfiguration::getSelfInstance(); // Load all classes for the application foreach (self::$testPaths as $shortPath) { // Debug message //* NOISY-DEBUG: */ printf('[%s:%d]: shortPath=%s' . PHP_EOL, __METHOD__, __LINE__, $shortPath); - // Create path name - $pathName = realpath(sprintf( - '%s/%s', - $cfg->getConfigEntry('base_path'), + // Construct path name + $pathName = sprintf( + '%s%s%s', + $configInstance->getConfigEntry('root_base_path'), + DIRECTORY_SEPARATOR, $shortPath - )); + ); // Debug message - //* NOISY-DEBUG: */ printf('[%s:%d]: pathName[%s]=%s' . PHP_EOL, __METHOD__, __LINE__, gettype($pathName), $pathName); + //* NOISY-DEBUG: */ printf('[%s:%d]: pathName[%s]=%s - BEFORE!' . PHP_EOL, __METHOD__, __LINE__, gettype($pathName), $pathName); + + // Try to find it + $realPathName = realpath($pathName); + + // Debug message + //* NOISY-DEBUG: */ printf('[%s:%d]: realPathName[%s]=%s - AFTER!' . PHP_EOL, __METHOD__, __LINE__, gettype($realPathName), $realPathName); // Is the path readable? - if (is_dir($pathName)) { + if ((is_dir($realPathName)) && (is_readable($realPathName))) { // Try to load the application classes - ClassLoader::getSelfInstance()->scanClassPath($pathName); + ClassLoader::getSelfInstance()->scanClassPath($realPathName); } // END - if } // END - foreach @@ -325,11 +335,11 @@ class ClassLoader { /** * Enables or disables strict naming-convention tests on class loading * - * @param $strictNamingConventionCheck Whether to strictly check naming-convention + * @param $strictNamingConvention Whether to strictly check naming-convention * @return void */ - public static function enableStrictNamingConventionCheck ($strictNamingConventionCheck = TRUE) { - self::$strictNamingConventionCheck = $strictNamingConventionCheck; + public static function enableStrictNamingConventionCheck ($strictNamingConvention = true) { + self::$strictNamingConvention = $strictNamingConvention; } /** @@ -340,8 +350,14 @@ class ClassLoader { * @return void */ public static function registerTestsPath ($relativePath) { + // Trace message + //* NOISY-DEBUG: */ printf('[%s:%d]: relativePath=%s - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $relativePath); + // "Register" it self::$testPaths[$relativePath] = $relativePath; + + // Trace message + //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__); } /** @@ -351,8 +367,14 @@ class ClassLoader { * @return void */ public static function autoLoad ($className) { + // Trace message + //* NOISY-DEBUG: */ printf('[%s:%d]: className=%s - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $className); + // Try to include this class self::getSelfInstance()->loadClassFile($className); + + // Trace message + //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__); } /** @@ -374,13 +396,13 @@ class ClassLoader { /** * Scans recursively a local path for class files which must have a prefix and a suffix as given by $this->suffix and $this->prefix * - * @param $basePath The relative base path to 'base_path' constant for all classes + * @param $basePath The relative base path to 'framework_base_path' constant for all classes * @param $ignoreList An optional list (array forced) of directory and file names which shall be ignored * @return void */ public function scanClassPath ($basePath, array $ignoreList = array() ) { // Is a list has been restored from cache, don't read it again - if ($this->listCached === TRUE) { + if ($this->listCached === true) { // Abort here return; } // END - if @@ -401,8 +423,8 @@ class ClassLoader { */ $basePath2 = realpath($basePath); - // If the basePath is FALSE it is invalid - if ($basePath2 === FALSE) { + // If the basePath is false it is invalid + if ($basePath2 === false) { /* @TODO: Do not exit here. */ exit(__METHOD__ . ': Cannot read ' . $basePath . ' !' . PHP_EOL); } else { @@ -419,13 +441,13 @@ class ClassLoader { // Get current entry $currentEntry = $iteratorInstance->current(); - // Get filename from iterator + // Get filename from iterator which is the class' name (according naming-convention) $fileName = $currentEntry->getFileName(); // Get the "FQFN" (path and file name) $fqfn = $currentEntry->getRealPath(); - // Current entry must be a file, not smaller than 100 bytes and not on ignore list + // Current entry must be a file, not smaller than 100 bytes and not on ignore list if ((!$currentEntry->isFile()) || (in_array($fileName, $this->ignoreList)) || (filesize($fqfn) < 100)) { // Advance to next entry $iteratorInstance->next(); @@ -452,31 +474,6 @@ class ClassLoader { } // END - while } - /** - * Load extra config files - * - * @return void - */ - public function loadExtraConfigs () { - // Backup old prefix - $oldPrefix = $this->prefix; - - // Set new prefix (temporary!) - $this->prefix = 'config-'; - - // Set base directory - $basePath = $this->configInstance->getConfigEntry('base_path') . 'framework/config/'; - - // Load all classes from the config directory - $this->scanClassPath($basePath); - - // Include these extra configs now - $this->includeExtraConfigs(); - - // Set back the old prefix - $this->prefix = $oldPrefix; - } - /** * Initializes our loader class * @@ -489,8 +486,8 @@ class ClassLoader { // Construct the FQFN for the cache if (!defined('DEVELOPER')) { - $this->listCacheFQFN = $this->configInstance->getConfigEntry('local_db_path') . 'list-' . $this->configInstance->getConfigEntry('app_name') . '.cache'; - $this->classCacheFQFN = $this->configInstance->getConfigEntry('local_db_path') . 'class-' . $this->configInstance->getConfigEntry('app_name') . '.cache'; + $this->listCacheFQFN = $this->configInstance->getConfigEntry('local_database_path') . 'list-' . $this->configInstance->getConfigEntry('detected_app_name') . '.cache'; + $this->classCacheFQFN = $this->configInstance->getConfigEntry('local_database_path') . 'class-' . $this->configInstance->getConfigEntry('detected_app_name') . '.cache'; } // END - if // Set suffix and prefix from configuration @@ -506,24 +503,21 @@ class ClassLoader { } // END - if // IS the cache there? - if (BaseFrameworkSystem::isReadableFile($this->listCacheFQFN)) { - // Get content - $cacheContent = file_get_contents($this->listCacheFQFN); - - // And convert it - $this->foundClasses = json_decode($cacheContent); + if (FrameworkBootstrap::isReadableFile($this->listCacheFQFN)) { + // Load and convert it + $this->foundClasses = json_decode(file_get_contents($this->listCacheFQFN)); // List has been restored from cache! - $this->listCached = TRUE; + $this->listCached = true; } // END - if // Does the class cache exist? - if (BaseFrameworkSystem::isReadableFile($this->listCacheFQFN)) { + if (FrameworkBootstrap::isReadableFile($this->listCacheFQFN)) { // Then include it - require($this->classCacheFQFN); + FrameworkBootstrap::loadInclude($this->classCacheFQFN); // Mark the class cache as loaded - $this->classesCached = TRUE; + $this->classesCached = true; } // END - if } @@ -534,7 +528,7 @@ class ClassLoader { * * @param $className The class that shall be loaded * @return void - * @throws InvalidArgumentException If strict-checking is enabled and class name is not following naming convention + * @throws InvalidArgumentException If strict-checking is enabled and class name is not following naming-convention */ private function loadClassFile ($className) { // Trace message @@ -544,7 +538,7 @@ class ClassLoader { $classNameParts = explode("\\", $className); // At least 3 parts should be there - if ((self::$strictNamingConventionCheck === TRUE) && (count($classNameParts) < 3)) { + if ((self::$strictNamingConvention === true) && (count($classNameParts) < 3)) { // Namespace scheme is: Project\Package[\SubPackage...] throw new InvalidArgumentException(sprintf('Class name "%s" is not conform to naming-convention: Project\Package[\SubPackage...]\SomeFooBar', $className)); } // END - if @@ -560,14 +554,14 @@ class ClassLoader { if ((isset($this->foundClasses[$fileName])) && (!isset($this->loadedClasses[$this->foundClasses[$fileName]]))) { // File is found and not loaded so load it only once //* NOISY-DEBUG: */ printf('[%s:%d] LOAD: %s - START' . PHP_EOL, __METHOD__, __LINE__, $fileName); - require($this->foundClasses[$fileName]); + FrameworkBootstrap::loadInclude($this->foundClasses[$fileName]); //* NOISY-DEBUG: */ printf('[%s:%d] LOAD: %s - END' . PHP_EOL, __METHOD__, __LINE__, $fileName); // Count this loaded class/interface/exception $this->total++; // Mark this class as loaded for other purposes than loading it. - $this->loadedClasses[$this->foundClasses[$fileName]] = TRUE; + $this->loadedClasses[$this->foundClasses[$fileName]] = true; // Remove it from classes list so it won't be found twice. //* NOISY-DEBUG: */ printf('[%s:%d] UNSET: %s' . PHP_EOL, __METHOD__, __LINE__, $fileName); @@ -576,8 +570,8 @@ class ClassLoader { // Developer mode excludes caching (better debugging) if (!defined('DEVELOPER')) { // Reset cache - //* NOISY-DEBUG: */ printf('[%s:%d] classesCached=FALSE' . PHP_EOL, __METHOD__, __LINE__); - $this->classesCached = FALSE; + //* NOISY-DEBUG: */ printf('[%s:%d] classesCached=false' . PHP_EOL, __METHOD__, __LINE__); + $this->classesCached = false; } // END - if } else { // Not found @@ -585,28 +579,6 @@ class ClassLoader { } } - /** - * Includes all extra config files - * - * @return void - */ - private function includeExtraConfigs () { - // Run through all class names (should not be much) - foreach ($this->foundClasses as $fileName => $fqfn) { - // Is this a config? - if (substr($fileName, 0, strlen($this->prefix)) == $this->prefix) { - // Then include it - //* NOISY-DEBUG: */ printf('[%s:%d] LOAD: %s - START' . PHP_EOL, __METHOD__, __LINE__, $fileName); - require($fqfn); - //* NOISY-DEBUG: */ printf('[%s:%d] LOAD: %s - END' . PHP_EOL, __METHOD__, __LINE__, $fileName); - - // Remove it from the list - //* NOISY-DEBUG: */ printf('[%s:%d] UNSET: %s' . PHP_EOL, __METHOD__, __LINE__, $fileName); - unset($this->foundClasses[$fileName]); - } // END - if - } // END - foreach - } - /** * Getter for total include counter *