X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=framework%2Floader%2Fclass_ClassLoader.php;h=fab4e559a640c56363f79845b2d64fffaa42ce80;hb=75480fa3fb44a2637c768d530d0c44645b5eca17;hp=211aded9b438cf368bb4a67a3103ea62f265bc62;hpb=146c8b3c929a1b0ab17d6605e5ae949ac44899c1;p=core.git diff --git a/framework/loader/class_ClassLoader.php b/framework/loader/class_ClassLoader.php index 211aded9..fab4e559 100644 --- a/framework/loader/class_ClassLoader.php +++ b/framework/loader/class_ClassLoader.php @@ -1,15 +1,16 @@ listCached === false) { // Writes the cache file of our list away $cacheContent = json_encode($this->foundClasses); - file_put_contents($this->listCacheFQFN, $cacheContent); + + // Open cache instance + $fileObject = $this->listCacheFile->openFile('w'); + + // And write whole list + $fileObject->fwrite($cacheContent); } // END - if // Skip here if already cached if ($this->classesCached === false) { // Generate a full-cache of all classes $cacheContent = ''; - foreach (array_keys($this->loadedClasses) as $fqfn) { + foreach (array_keys($this->loadedClasses) as $fileInstance) { + // Open file + $fileObject = $fileInstance->openFile('r'); + // Load the file - $cacheContent .= file_get_contents($fqfn); + // @TODO Add some uglifying code (compress) here + $cacheContent .= $fileObject->fread($fileInstance->getSize()); } // END - foreach + // Open file + $fileObject = $this->classCacheFile->openFile('w'); + // And write it away - file_put_contents($this->classCacheFQFN, $cacheContent); + $fileObject->fwrite($cacheContent); } // END - if } @@ -207,7 +220,7 @@ class ClassLoader { $loaderInstance = self::getSelfInstance(); // Get config instance - $cfg = FrameworkConfiguration::getSelfInstance(); + $configInstance = FrameworkBootstrap::getConfigurationInstance(); // Load all classes foreach (self::$frameworkPaths as $shortPath) { @@ -215,26 +228,28 @@ class ClassLoader { //* NOISY-DEBUG: */ printf('[%s:%d]: shortPath=%s' . PHP_EOL, __METHOD__, __LINE__, $shortPath); // Generate full path from it - $pathName = realpath(sprintf( - '%smain/%s/', - $cfg->getConfigEntry('framework_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)) { + 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 @@ -254,7 +269,7 @@ class ClassLoader { $loaderInstance = self::getSelfInstance(); // Get config instance - $cfg = FrameworkConfiguration::getSelfInstance(); + $configInstance = FrameworkBootstrap::getConfigurationInstance(); // Load all classes for the application foreach (self::$frameworkPaths as $shortPath) { @@ -263,9 +278,11 @@ class ClassLoader { // Create path name $pathName = realpath(sprintf( - '%s/%s/%s', - $cfg->getConfigEntry('application_base_path'), - $cfg->getConfigEntry('detected_app_name'), + '%s%s%s%s%s', + $configInstance->getConfigEntry('application_base_path'), + DIRECTORY_SEPARATOR, + $configInstance->getConfigEntry('detected_app_name'), + DIRECTORY_SEPARATOR, $shortPath )); @@ -293,7 +310,7 @@ class ClassLoader { //* NOISY-DEBUG: */ printf('[%s:%d]: CALLED!' . PHP_EOL, __METHOD__, __LINE__); // Get config instance - $cfg = FrameworkConfiguration::getSelfInstance(); + $configInstance = FrameworkBootstrap::getConfigurationInstance(); // Load all classes for the application foreach (self::$testPaths as $shortPath) { @@ -302,8 +319,9 @@ class ClassLoader { // Construct path name $pathName = sprintf( - '%s/%s', - $cfg->getConfigEntry('root_base_path'), + '%s%s%s', + $configInstance->getConfigEntry('root_base_path'), + DIRECTORY_SEPARATOR, $shortPath ); @@ -311,15 +329,15 @@ class ClassLoader { //* NOISY-DEBUG: */ printf('[%s:%d]: pathName[%s]=%s - BEFORE!' . PHP_EOL, __METHOD__, __LINE__, gettype($pathName), $pathName); // Try to find it - $pathName = realpath($pathName); + $realPathName = realpath($pathName); // Debug message - //* NOISY-DEBUG: */ printf('[%s:%d]: pathName[%s]=%s - AFTER!' . PHP_EOL, __METHOD__, __LINE__, gettype($pathName), $pathName); + //* NOISY-DEBUG: */ printf('[%s:%d]: realPathName[%s]=%s - AFTER!' . PHP_EOL, __METHOD__, __LINE__, gettype($realPathName), $realPathName); // Is the path readable? - if ((is_dir($pathName)) && (is_readable($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 @@ -330,11 +348,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; } /** @@ -381,7 +399,7 @@ class ClassLoader { // Is the instance there? if (is_null(self::$selfInstance)) { // Get a new one - self::$selfInstance = ClassLoader::createClassLoader(FrameworkConfiguration::getSelfInstance()); + self::$selfInstance = ClassLoader::createClassLoader(FrameworkBootstrap::getConfigurationInstance()); } // END - if // Return the instance @@ -436,14 +454,11 @@ 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 - if ((!$currentEntry->isFile()) || (in_array($fileName, $this->ignoreList)) || (filesize($fqfn) < 100)) { + // Current entry must be a file, not smaller than 100 bytes and not on ignore list + if ((!$currentEntry->isFile()) || (in_array($fileName, $this->ignoreList)) || ($currentEntry->getSize() < 100)) { // Advance to next entry $iteratorInstance->next(); @@ -456,11 +471,11 @@ class ClassLoader { //* NOISY-DEBUG: */ printf('[%s:%d] FOUND: %s' . PHP_EOL, __METHOD__, __LINE__, $fileName); if ((substr($fileName, 0, strlen($this->prefix)) == $this->prefix) && (substr($fileName, -strlen($this->suffix), strlen($this->suffix)) == $this->suffix)) { // Add it to the list - //* NOISY-DEBUG: */ printf('[%s:%d] ADD: %s,fqfn=%s' . PHP_EOL, __METHOD__, __LINE__, $fileName, $fqfn); - $this->foundClasses[$fileName] = $fqfn; + //* NOISY-DEBUG: */ printf('[%s:%d] ADD: %s,currentEntry=%s' . PHP_EOL, __METHOD__, __LINE__, $fileName, $currentEntry); + $this->foundClasses[$fileName] = $currentEntry; } else { // Not added - //* NOISY-DEBUG: */ printf('[%s:%d] NOT ADDED: %s,fqfn=%s' . PHP_EOL, __METHOD__, __LINE__, $fileName, $fqfn); + //* NOISY-DEBUG: */ printf('[%s:%d] NOT ADDED: %s,currentEntry=%s' . PHP_EOL, __METHOD__, __LINE__, $fileName, $currentEntry); } // Advance to next entry @@ -481,8 +496,8 @@ class ClassLoader { // Construct the FQFN for the cache if (!defined('DEVELOPER')) { - $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'; + $this->listCacheFile = new SplFileInfo($this->configInstance->getConfigEntry('local_database_path') . 'list-' . $this->configInstance->getConfigEntry('detected_app_name') . '.cache'); + $this->classCacheFile = new SplFileInfo($this->configInstance->getConfigEntry('local_database_path') . 'class-' . $this->configInstance->getConfigEntry('detected_app_name') . '.cache'); } // END - if // Set suffix and prefix from configuration @@ -497,22 +512,19 @@ class ClassLoader { return; } // END - if - // IS the cache there? - if (FrameworkBootstrap::isReadableFile($this->listCacheFQFN)) { - // Get content - $cacheContent = file_get_contents($this->listCacheFQFN); - - // And convert it - $this->foundClasses = json_decode($cacheContent); + // Is the cache there? + if (FrameworkBootstrap::isReadableFile($this->listCacheFile)) { + // Load and convert it + $this->foundClasses = json_decode(file_get_contents($this->listCacheFile->getPathname())); // List has been restored from cache! $this->listCached = true; } // END - if // Does the class cache exist? - if (FrameworkBootstrap::isReadableFile($this->listCacheFQFN)) { + if (FrameworkBootstrap::isReadableFile($this->classCacheFile)) { // Then include it - FrameworkBootstrap::loadInclude($this->classCacheFQFN); + FrameworkBootstrap::loadInclude($this->classCacheFile); // Mark the class cache as loaded $this->classesCached = true; @@ -526,7 +538,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 @@ -536,20 +548,20 @@ 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) < 5)) { // Namespace scheme is: Project\Package[\SubPackage...] - throw new InvalidArgumentException(sprintf('Class name "%s" is not conform to naming-convention: Project\Package[\SubPackage...]\SomeFooBar', $className)); + throw new InvalidArgumentException(sprintf('Class name "%s" is not conform to naming-convention: Tld\Domain\Project\Package[\SubPackage...]\SomeFooBar', $className)); } // END - if // Get last element $shortClassName = array_pop($classNameParts); // Create a name with prefix and suffix - $fileName = $this->prefix . $shortClassName . $this->suffix; + $fileName = sprintf('%s%s%s', $this->prefix, $shortClassName, $this->suffix); // Now look it up in our index //* NOISY-DEBUG: */ printf('[%s:%d] ISSET: %s' . PHP_EOL, __METHOD__, __LINE__, $fileName); - if ((isset($this->foundClasses[$fileName])) && (!isset($this->loadedClasses[$this->foundClasses[$fileName]]))) { + if ((isset($this->foundClasses[$fileName])) && (!isset($this->loadedClasses[$this->foundClasses[$fileName]->getPathname()]))) { // File is found and not loaded so load it only once //* NOISY-DEBUG: */ printf('[%s:%d] LOAD: %s - START' . PHP_EOL, __METHOD__, __LINE__, $fileName); FrameworkBootstrap::loadInclude($this->foundClasses[$fileName]); @@ -559,7 +571,7 @@ class ClassLoader { $this->total++; // Mark this class as loaded for other purposes than loading it. - $this->loadedClasses[$this->foundClasses[$fileName]] = true; + $this->loadedClasses[$this->foundClasses[$fileName]->getPathname()] = 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);