首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

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

2013-11-08 
PHP 自动加载对象(以MVC框架为例)?phpclass autoloader {public static $loaderpublic static function

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 stringThe appServerRootDir. eg: 'C:/Www/phpmvc'* @param arrayAn array of sub-application paths,<br>*  eg: $subAppPaths[] = 'WEB-INF/classes/example';, ...* @param stringThe 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 nowif($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 anyif(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 4global $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 scriptini_set('include_path', $classPath);return $classPath;// for testing}// ----- Public Methods ------------------------------------------------- //function getClassPath($appServerRootDir='', $appDirs, $osType='') {// Set AppServer root manually for nowif($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.* * @paramstringThe path string* @paramstringThe path string* @paramstringThe operating type [optional]* @public* @returnsstring*/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.** @paramstringThe operating type [optional]* @protected* @returnsstring*/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 4global $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 stringThe 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);?>

热点排行