Rumah >pembangunan bahagian belakang >tutorial php >PHP 自动加载对象(以MVC框架替例)

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBasal
2016-06-13 10:55:03916semak imbas

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

<?phpclass autoloader {	public static $loader;		public static function init() {		if (self::$loader == NULL)			self::$loader = new self ();				return self::$loader;	}		public function __construct() {		spl_autoload_register ( array ($this, 'model' ) );		spl_autoload_register ( array ($this, 'helper' ) );		spl_autoload_register ( array ($this, 'controller' ) );		spl_autoload_register ( array ($this, 'library' ) );	}		public function library($class) {		set_include_path ( get_include_path () . PATH_SEPARATOR . '/lib/' );		spl_autoload_extensions ( '.library.php' );		spl_autoload ( $class );	}		public function controller($class) {		$class = preg_replace ( '/_controller$/ui', '', $class );				set_include_path ( get_include_path () . PATH_SEPARATOR . '/controller/' );		spl_autoload_extensions ( '.controller.php' );		spl_autoload ( $class );	}		public function model($class) {		$class = preg_replace ( '/_model$/ui', '', $class );				set_include_path ( get_include_path () . PATH_SEPARATOR . '/model/' );		spl_autoload_extensions ( '.model.php' );		spl_autoload ( $class );	}		public function helper($class) {		$class = preg_replace ( '/_helper$/ui', '', $class );				set_include_path ( get_include_path () . PATH_SEPARATOR . '/helper/' );		spl_autoload_extensions ( '.helper.php' );		spl_autoload ( $class );	}}//callautoloader::init ();?>

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

<?phpfunction __autoload($class_name) {@require $class_name . '.php';}?> 

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

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

<?php/** $Header: /PHPMVC/phpmvc-base/WEB-INF/classes/phpmvc/utils/ClassPath.php,v 1.4 2006/02/22 07:18:26 who Exp $* $Revision: 1.4 $* $Date: 2006/02/22 07:18:26 $*/class ClassPath {	// ----- Depreciated ---------------------------------------------------- //	/**	* <p>Setup the application class paths (PHP 'include_path') for the included	* class files, for the duration of the main script</p>	*	*<p>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,<br>	*  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	* <p>	* 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.	* <p>	* 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;	}}?>
?

?

<?php/** $Header: oohforms/WEB-INF/ModulePaths.php* $Revision:* $Date: 2003.04.22** ====================================================================* The module paths** @author John C Wildenauer* @version* @public*/class ModulePaths {	/**	* Return an array of global paths	*	* @public	* @returns array	*/	function getModulePaths() {		// Setup the main module include() directories here		// Note: could be placed in an xml config file later !!		$appDirs	= array();		$appDirs[]	= ''; // starting with the sub-application home directory		$appDirs[]	= 'login';		$appDirs[]	= 'login/classes';		$appDirs[]	= 'login/tpl';		$appDirs[]	= 'project';		$appDirs[]	= 'project/classes';		$appDirs[]	= 'project/tpl';		return $appDirs;	}}?>

?调用方法autoloader.php

<?php// Set the application path$moduleRootDir = 'D:/workspace/eh_plat_wms/dev_src';	// no trailing slash// Set the OS Type [Optional] [UNIX|WINDOWS|MAC] if we have// trouble detecting the server OS type. Eg: path errors.$osType = 'WINDOWS';// Setup application class paths firstinclude 'lib/ClassPath.php';// Setup the module pathsinclude 'config/ModulePaths.php';$modulePaths = ModulePaths::getModulePaths();$mPath = ClassPath::getClassPath($moduleRootDir,$modulePaths, $osType);// Retrieve and merge the php.ini path settings$iniPath = ini_get('include_path');$cPath = ClassPath::concatPaths($mPath, $iniPath, $osType);echo $cPath;// And set the 'include_path' variables, as used by the file functionsini_set('include_path', $cPath);?>
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn