Home  >  Article  >  Backend Development  >  PHP 自动加载对象(以MVC框架替例)

PHP 自动加载对象(以MVC框架替例)

WBOY
WBOYOriginal
2016-06-13 12:33:561070browse

PHP 自动加载对象(以MVC框架为例)

1, 在程序使用未声明的类时会自动调用 __autolaod() 函数来加载;

 

2.其中 spl_autoload_register() 用来注册一个自动调用的函数, 可以注册多个函数!

3.$iniPath = ini_get('include_path');ini_set('include_path', $iniPath. . $cPath);通过设置环境变量来达到autoload目的,设置包含路径,以后可以直接包含这些目录中的文件,不需要再写详细的路径了。方法三取自php.MVC,使用参照php.MVC文档

Setup the application class paths (PHP 'include_path') for the included
	* class files, for the duration of the main script

* *

Returns the class path string for testing purposes * * @depreciated * @param string The appServerRootDir. eg: 'C:/Www/phpmvc' * @param array An array of sub-application paths,
* eg: $subAppPaths[] = 'WEB-INF/classes/example';, ... * @param string The OS [Optional] [UNIX|WINDOWS|MAC|...] if we have * trouble detecting the server OS type. Eg: path errors. * @public * @returns string */ function setClassPath($appServerRootDir='', $subAppPaths='', $osType='') { // Set AppServer root manually for now if($appServerRootDir == '') { echo 'Error: ClassPath :- No php.MVC application root directory specified'; exit; } #$_ENV; // PHP Superglobals !! // Setup the main phpmvc application include() directories here // Note: could be placed in a n xml config file later !! $appDirs = array(); $appDirs[] = ''; // application root directory $appDirs[] = 'lib'; // Add the sub-application paths, if any if(is_array($subAppPaths)) { $appDirs = array_merge($appDirs, $subAppPaths); } // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) $winDir = NULL; if( (int)phpversion() > 4 ) { // PHP 5 $winDir = $_ENV["windir"]; // See: PHP v.4.1.0 Superglobals } else { // PHP 4 global $HTTP_ENV_VARS; // depreciated- if( array_key_exists("windir", $HTTP_ENV_VARS) ) { $winDir = $HTTP_ENV_VARS["windir"]; // will be replaced with $_ENV } } if($osType != '') { if( eregi("WINDOWS", $osType) ) { $delim = ';'; // Windows } elseif( eregi("UNIX", $osType) ) { $delim = ':'; // Unix } elseif( eregi("MAC", $osType) ) { $delim = ':'; // Mac !!!!! } } if($delim == NULL) { if( eregi("WIN", $winDir) ) { // _ENV["C:\\Win2K"] $delim = ';'; // Windows } else { $delim = ':'; // Unix, Mac !! } } // Get the current working directory $path = $appServerRootDir; // Strip path directories below 'WEB-INF' $pathToWebInf = ereg_replace("WEB-INF.*$", '', $path); // Replace path backslashes with forward slashes // Note: PHP Regular Expressions do not work with backslashes $pathToWebInf = str_replace("\\", "/", $pathToWebInf); // Drop the trailing slash, if one is present $pathToWebInf = ereg_replace("/$", '', $pathToWebInf); // Setup the environment path string $classPath = NULL; foreach($appDirs as $appDir) { $classPath .= $pathToWebInf.'/'.$appDir.$delim; } // Remove trailing delimiter character $classPath = substr($classPath, 0, -1); // Setup the include_path for the duration of the main php.MVC script ini_set('include_path', $classPath); return $classPath; // for testing } // ----- Public Methods ------------------------------------------------- // function getClassPath($appServerRootDir='', $appDirs, $osType='') { // Set AppServer root manually for now if($appServerRootDir == '') { echo 'Error: ClassPath :- No php.MVC application root directory specified'; exit; } #$_ENV; // PHP Superglobals !! // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) if($osType == '') { // PHP's build in constant "PATH_SEPARATOR" [unix (:) / win (;)] $delim = PATH_SEPARATOR; } else { // It is handy to be able to specift the OS type for testing $delim = ClassPath::getPathDelimiter($osType); } // Get the current working directory $path = $appServerRootDir; // Strip path directories below 'WEB-INF' $pathToWebInf = ereg_replace("WEB-INF.*$", '', $path); // Replace path backslashes with forward slashes // Note: PHP Regular Expressions do not work with backslashes $pathToWebInf = str_replace("\\", "/", $pathToWebInf); // Drop the trailing slash, if one is present $pathToWebInf = ereg_replace("/$", '', $pathToWebInf); // Setup the environment path string $classPath = NULL; $AbsolutePath = False; // Say: "/Some/Unix/Path/" or "D:\Some\Win\Path" foreach($appDirs as $appDir) { // Check if the specified system path is an absolute path. Absolute system // paths start with a "/" on Unix, and "Ch\:" or "Ch/:" on Win 32. // Eg: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path". $AbsolutePath = ClassPath::absolutePath($appDir); if($AbsolutePath == True) { $classPath .= $appDir.$delim; } else { $classPath .= $pathToWebInf.'/'.$appDir.$delim; } } // Remove trailing delimiter character $classPath = substr($classPath, 0, -1); return $classPath; // for testing } /** * Concatenate environment path strings *

* Returns the two path strings joined with the correct environment * string delimiter for the host operating system. * * @param string The path string * @param string The path string * @param string The operating type [optional] * @public * @returns string */ function concatPaths($path1, $path2, $osType='') { // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) $delim = ClassPath::getPathDelimiter($osType); $path = $path1 . $delim . $path2; return $path; } // ----- Protected Methods ---------------------------------------------- // /** * Get environment path delimiter. *

* Returns the environment string delimiter for the host operating system. * * @param string The operating type [optional] * @protected * @returns string */ function getPathDelimiter($osType='') { // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) $winDir = NULL; if( (int)phpversion() > 4 ) { // PHP 5 $winDir = $_ENV["windir"]; // See: PHP v.4.1.0 Superglobals } else { // PHP 4 global $HTTP_ENV_VARS; // depreciated- if( array_key_exists("windir", $HTTP_ENV_VARS) ) { $winDir = $HTTP_ENV_VARS["windir"]; // will be replaced with $_ENV } } if($osType != '') { if( eregi("WINDOWS", $osType) ) { $delim = ';'; // Windows } elseif( eregi("UNIX", $osType) ) { $delim = ':'; // Unix } elseif( eregi("MAC", $osType) ) { $delim = ':'; // Mac !!!!! } } if($delim == NULL) { if( eregi("WIN", $winDir) ) { // _ENV["C:\\Win2K"] $delim = ';'; // Windows } else { $delim = ':'; // Unix, Mac !! } } return $delim; } /** * Check if the specified system path is an absolute path. Absolute system * paths start with a "/" on Unix, and "Ch\:" or "Ch/:" on Win 32. * Eg: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path". * * Returns True if the suppplied path absolute, otherwise returns False * * @param string The path to check, like: "/Some/Unix/Path/" or * "D:\Some\Win\Path". * @public * @returns boolean */ function absolutePath($systemPath) { // Say: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path" $fAbsolutePath = False; // Boolean flag value //"[/]Some/Unix/Path/" if (preg_match("/^\//", $systemPath)) { $fAbsolutePath = True; //"[D:\]Some\Win\Path" // "i" says "ignore case" // Note the extra escape "\" reqd for this to work with PHP !!! } elseif(preg_match("/^[a-z]:\\\/i", $systemPath)) { $fAbsolutePath = True; //"[D:/]Some/Win/Path" } elseif(preg_match("/^[a-z]:\//i", $systemPath)) { $fAbsolutePath = True; } return $fAbsolutePath; } } ?>

?

?


?调用方法autoloader.php

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn