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

Java代码  

  1. <?php  
  2. class autoloader {  
  3.     public static $loader;  
  4.       
  5.     public static function init() {  
  6.         if (self::$loader == NULL)  
  7.             self::$loader = new self ();  
  8.           
  9.         return self::$loader;  
  10.     }  
  11.       
  12.     public function __construct() {  
  13.         spl_autoload_register ( array ($this, 'model' ) );  
  14.         spl_autoload_register ( array ($this, 'helper' ) );  
  15.         spl_autoload_register ( array ($this, 'controller' ) );  
  16.         spl_autoload_register ( array ($this, 'library' ) );  
  17.     }  
  18.       
  19.     public function library($class) {  
  20.         set_include_path ( get_include_path () . PATH_SEPARATOR . '/lib/' );  
  21.         spl_autoload_extensions ( '.library.php' );  
  22.         spl_autoload ( $class );  
  23.     }  
  24.       
  25.     public function controller($class) {  
  26.         $class = preg_replace ( '/_controller$/ui', '', $class );  
  27.           
  28.         set_include_path ( get_include_path () . PATH_SEPARATOR . '/controller/' );  
  29.         spl_autoload_extensions ( '.controller.php' );  
  30.         spl_autoload ( $class );  
  31.     }  
  32.       
  33.     public function model($class) {  
  34.         $class = preg_replace ( '/_model$/ui', '', $class );  
  35.           
  36.         set_include_path ( get_include_path () . PATH_SEPARATOR . '/model/' );  
  37.         spl_autoload_extensions ( '.model.php' );  
  38.         spl_autoload ( $class );  
  39.     }  
  40.       
  41.     public function helper($class) {  
  42.         $class = preg_replace ( '/_helper$/ui', '', $class );  
  43.           
  44.         set_include_path ( get_include_path () . PATH_SEPARATOR . '/helper/' );  
  45.         spl_autoload_extensions ( '.helper.php' );  
  46.         spl_autoload ( $class );  
  47.     }  
  48.   
  49. }  
  50.   
  51. //call  
  52. autoloader::init ();  
  53. ?>  

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

Java代码  

  1. <?php  
  2. function __autoload($class_name) {  
  3. @require $class_name . '.php';  
  4. }  
  5. ?>   

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

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

Classpath.php代码  

  1. <?php  
  2. /*  
  3. * $Header: /PHPMVC/phpmvc-base/WEB-INF/classes/phpmvc/utils/ClassPath.php,v 1.4 2006/02/22 07:18:26 who Exp $  
  4. * $Revision: 1.4 $  
  5. * $Date: 2006/02/22 07:18:26 $  
  6. */  
  7. class ClassPath {  
  8.   
  9.     // ----- Depreciated ---------------------------------------------------- //  
  10.   
  11.     /**  
  12.     * <p>Setup the application class paths (PHP 'include_path') for the included  
  13.     * class files, for the duration of the main script</p>  
  14.     *  
  15.     *<p>Returns the class path string for testing purposes  
  16.     *  
  17.     * @depreciated  
  18.     * @param string The appServerRootDir. eg: 'C:/Www/phpmvc'  
  19.     * @param array      An array of sub-application paths,<br>  
  20.     *  eg: $subAppPaths[] = 'WEB-INF/classes/example';, ...  
  21.     * @param string The OS [Optional] [UNIX|WINDOWS|MAC|...] if we have  
  22.     *  trouble detecting the server OS type. Eg: path errors.  
  23.     * @public  
  24.     * @returns string  
  25.     */  
  26.     function setClassPath($appServerRootDir='', $subAppPaths='', $osType='') {  
  27.   
  28.         // Set AppServer root manually for now  
  29.         if($appServerRootDir == '') {  
  30.             echo 'Error: ClassPath :- No php.MVC application root directory specified';  
  31.             exit;  
  32.         }  
  33.   
  34.         #$_ENV; // PHP Superglobals !!  
  35.   
  36.         // Setup the main phpmvc application include() directories here  
  37.         // Note: could be placed in a n xml config file later !!  
  38.         $appDirs = array();  
  39.         $appDirs[] = ''; // application root directory  
  40.         $appDirs[] = 'lib';  
  41.   
  42.         // Add the sub-application paths, if any  
  43.         if(is_array($subAppPaths)) {  
  44.             $appDirs = array_merge($appDirs, $subAppPaths);  
  45.         }  
  46.   
  47.   
  48.         // Setup the platform specific path delimiter character  
  49.         $delim = NULL;  // path delimiter character. (Windows, Unix, Mac!!)  
  50.         $winDir = NULL;  
  51.         if( (int)phpversion() > 4 ) {  
  52.             // PHP 5  
  53.             $winDir = $_ENV["windir"];                  // See: PHP v.4.1.0 Superglobals   
  54.         } else {  
  55.             // PHP 4  
  56.             global $HTTP_ENV_VARS;                      // depreciated-   
  57.             if( array_key_exists("windir", $HTTP_ENV_VARS) ) {  
  58.                 $winDir = $HTTP_ENV_VARS["windir"]; // will be replaced with $_ENV  
  59.             }  
  60.         }  
  61.   
  62.   
  63.         if($osType != '') {  
  64.             if( eregi("WINDOWS", $osType) ) {  
  65.                 $delim = ';';   // Windows  
  66.             } elseif( eregi("UNIX", $osType) ) {  
  67.                 $delim = ':';   // Unix  
  68.             } elseif( eregi("MAC", $osType) ) {  
  69.                 $delim = ':';   // Mac !!!!!  
  70.             }  
  71.         }  
  72.   
  73.         if($delim == NULL) {  
  74.             if( eregi("WIN", $winDir) ) { // _ENV["C:\\Win2K"]  
  75.                 $delim = ';';   // Windows  
  76.             } else {  
  77.                 $delim = ':';   // Unix, Mac !!  
  78.             }  
  79.         }  
  80.   
  81.         // Get the current working directory  
  82.         $path = $appServerRootDir;  
  83.   
  84.         // Strip path directories below 'WEB-INF'  
  85.         $pathToWebInf = ereg_replace("WEB-INF.*$", '', $path);  
  86.   
  87.         // Replace path backslashes with forward slashes  
  88.         // Note: PHP Regular Expressions do not work with backslashes  
  89.         $pathToWebInf = str_replace("\\", "/", $pathToWebInf);  
  90.   
  91.         // Drop the trailing slash, if one is present  
  92.         $pathToWebInf = ereg_replace("/$", '', $pathToWebInf);  
  93.   
  94.         // Setup the environment path string  
  95.         $classPath = NULL;  
  96.         foreach($appDirs as $appDir) {    
  97.             $classPath .= $pathToWebInf.'/'.$appDir.$delim;  
  98.         }  
  99.   
  100.         // Remove trailing delimiter character  
  101.         $classPath = substr($classPath, 0, -1);   
  102.   
  103.         // Setup the include_path for the duration of the main php.MVC script  
  104.         ini_set('include_path', $classPath);  
  105.   
  106.         return $classPath;  // for testing  
  107.   
  108.     }  
  109.   
  110.   
  111.     // ----- Public Methods ------------------------------------------------- //  
  112.   
  113.     function getClassPath($appServerRootDir='', $appDirs, $osType='') {  
  114.   
  115.         // Set AppServer root manually for now  
  116.         if($appServerRootDir == '') {  
  117.             echo 'Error: ClassPath :- No php.MVC application root directory specified';  
  118.             exit;  
  119.         }  
  120.   
  121.         #$_ENV; // PHP Superglobals !!  
  122.   
  123.         // Setup the platform specific path delimiter character  
  124.         $delim = NULL;  // path delimiter character. (Windows, Unix, Mac!!)  
  125.         if($osType == '') {  
  126.             // PHP's build in constant "PATH_SEPARATOR" [unix (:) / win (;)]  
  127.             $delim = PATH_SEPARATOR;  
  128.         } else {  
  129.             // It is handy to be able to specift the OS type for testing  
  130.             $delim = ClassPath::getPathDelimiter($osType);  
  131.         }  
  132.   
  133.         // Get the current working directory  
  134.         $path = $appServerRootDir;  
  135.   
  136.         // Strip path directories below 'WEB-INF'  
  137.         $pathToWebInf = ereg_replace("WEB-INF.*$", '', $path);  
  138.   
  139.         // Replace path backslashes with forward slashes  
  140.         // Note: PHP Regular Expressions do not work with backslashes  
  141.         $pathToWebInf = str_replace("\\", "/", $pathToWebInf);  
  142.   
  143.         // Drop the trailing slash, if one is present  
  144.         $pathToWebInf = ereg_replace("/$", '', $pathToWebInf);  
  145.   
  146.         // Setup the environment path string  
  147.         $classPath      = NULL;  
  148.         $AbsolutePath   = False;    // Say: "/Some/Unix/Path/" or "D:\Some\Win\Path"  
  149.         foreach($appDirs as $appDir) {    
  150.   
  151.             // Check if the specified system path is an absolute path. Absolute system  
  152.             // paths start with a "/" on Unix, and "Ch\:" or "Ch/:" on Win 32.  
  153.             // Eg: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path".  
  154.             $AbsolutePath = ClassPath::absolutePath($appDir);  
  155.   
  156.             if($AbsolutePath == True) {  
  157.                 $classPath .= $appDir.$delim;  
  158.             } else {  
  159.                 $classPath .= $pathToWebInf.'/'.$appDir.$delim;  
  160.             }  
  161.   
  162.         }  
  163.   
  164.         // Remove trailing delimiter character  
  165.         $classPath = substr($classPath, 0, -1);   
  166.   
  167.         return $classPath;  // for testing  
  168.   
  169.     }  
  170.   
  171.   
  172.     /**  
  173.     * Concatenate environment path strings  
  174.     * <p>  
  175.     * Returns the two path strings joined with the correct environment  
  176.     * string delimiter for the host operating system.  
  177.     *   
  178.     * @param        string  The path string  
  179.     * @param        string  The path string  
  180.     * @param        string  The operating type [optional]  
  181.     * @public  
  182.     * @returns  string    
  183.     */  
  184.     function concatPaths($path1, $path2, $osType='') {  
  185.   
  186.         // Setup the platform specific path delimiter character  
  187.         $delim = NULL;  // path delimiter character. (Windows, Unix, Mac!!)  
  188.         $delim = ClassPath::getPathDelimiter($osType);  
  189.   
  190.         $path = $path1 . $delim . $path2;  
  191.         return $path;  
  192.   
  193.     }  
  194.   
  195.   
  196.     // ----- Protected Methods ---------------------------------------------- //  
  197.   
  198.     /**  
  199.     * Get environment path delimiter.  
  200.     * <p>  
  201.     * Returns the environment string delimiter for the host operating system.  
  202.     *  
  203.     * @param        string  The operating type [optional]  
  204.     * @protected  
  205.     * @returns  string    
  206.     */  
  207.     function getPathDelimiter($osType='') {  
  208.   
  209.         // Setup the platform specific path delimiter character  
  210.         $delim = NULL;  // path delimiter character. (Windows, Unix, Mac!!)  
  211.         $winDir = NULL;  
  212.         if( (int)phpversion() > 4 ) {  
  213.             // PHP 5  
  214.             $winDir = $_ENV["windir"];                  // See: PHP v.4.1.0 Superglobals   
  215.         } else {  
  216.             // PHP 4  
  217.             global $HTTP_ENV_VARS;                      // depreciated-   
  218.             if( array_key_exists("windir", $HTTP_ENV_VARS) ) {  
  219.                 $winDir = $HTTP_ENV_VARS["windir"]; // will be replaced with $_ENV  
  220.             }  
  221.         }  
  222.   
  223.         if($osType != '') {  
  224.             if( eregi("WINDOWS", $osType) ) {  
  225.                 $delim = ';';   // Windows  
  226.             } elseif( eregi("UNIX", $osType) ) {  
  227.                 $delim = ':';   // Unix  
  228.             } elseif( eregi("MAC", $osType) ) {  
  229.                 $delim = ':';   // Mac !!!!!  
  230.             }  
  231.         }  
  232.   
  233.         if($delim == NULL) {  
  234.             if( eregi("WIN", $winDir) ) { // _ENV["C:\\Win2K"]  
  235.                 $delim = ';';   // Windows  
  236.             } else {  
  237.                 $delim = ':';   // Unix, Mac !!  
  238.             }  
  239.         }  
  240.   
  241.         return $delim;  
  242.   
  243.     }  
  244.   
  245.   
  246.     /**   
  247.     * Check if the specified system path is an absolute path. Absolute system  
  248.     * paths start with a "/" on Unix, and "Ch\:" or "Ch/:" on Win 32.  
  249.     * Eg: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path".  
  250.     *  
  251.     * Returns True if the suppplied path absolute, otherwise returns False  
  252.     *  
  253.     * @param string The path to check, like: "/Some/Unix/Path/" or  
  254.     *                       "D:\Some\Win\Path".  
  255.     * @public  
  256.     * @returns boolean  
  257.     */  
  258.     function absolutePath($systemPath) {  
  259.   
  260.         // Say: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path"  
  261.         $fAbsolutePath  = False;        // Boolean flag value  
  262.   
  263.         //"[/]Some/Unix/Path/"  
  264.         if (preg_match("/^\//", $systemPath)) {  
  265.             $fAbsolutePath = True;  
  266.         //"[D:\]Some\Win\Path"  
  267.         // "i" says "ignore case"  
  268.         // Note the extra escape "\" reqd for this to work with  PHP !!!  
  269.         } elseif(preg_match("/^[a-z]:\\\/i", $systemPath)) {      
  270.             $fAbsolutePath = True;  
  271.         //"[D:/]Some/Win/Path"  
  272.         } elseif(preg_match("/^[a-z]:\//i", $systemPath)) {  
  273.             $fAbsolutePath = True;  
  274.         }  
  275.   
  276.         return $fAbsolutePath;  
  277.   
  278.     }  
  279.   
  280. }  
  281. ?>  

 

 

Modulepaths.php代码  

  1. <?php  
  2. /*  
  3. * $Header: oohforms/WEB-INF/ModulePaths.php  
  4. * $Revision:  
  5. * $Date: 2003.04.22  
  6. *  
  7. * ====================================================================  
  8. * The module paths  
  9. *  
  10. * @author John C Wildenauer  
  11. * @version  
  12. * @public  
  13. */  
  14. class ModulePaths {  
  15.   
  16.     /**  
  17.     * Return an array of global paths  
  18.     *  
  19.     * @public  
  20.     * @returns array  
  21.     */  
  22.     function getModulePaths() {  
  23.   
  24.         // Setup the main module include() directories here  
  25.         // Note: could be placed in an xml config file later !!  
  26.         $appDirs    = array();  
  27.         $appDirs[]  = ''; // starting with the sub-application home directory  
  28.   
  29.         $appDirs[]  = 'login';  
  30.         $appDirs[]  = 'login/classes';  
  31.         $appDirs[]  = 'login/tpl';  
  32.   
  33.         $appDirs[]  = 'project';  
  34.         $appDirs[]  = 'project/classes';  
  35.         $appDirs[]  = 'project/tpl';  
  36.   
  37.         return $appDirs;  
  38.     }  
  39.   
  40. }  
  41. ?>  

 调用方法autoloader.php

Java代码  

  1. <?php  
  2. // Set the application path  
  3. $moduleRootDir = 'D:/workspace/eh_plat_wms/dev_src';    // no trailing slash  
  4.   
  5. // Set the OS Type [Optional] [UNIX|WINDOWS|MAC] if we have  
  6. // trouble detecting the server OS type. Eg: path errors.  
  7. $osType = 'WINDOWS';  
  8.   
  9. // Setup application class paths first  
  10. include 'lib/ClassPath.php';  
  11.   
  12. // Setup the module paths  
  13. include 'config/ModulePaths.php';  
  14. $modulePaths = ModulePaths::getModulePaths();  
  15. $mPath = ClassPath::getClassPath($moduleRootDir,$modulePaths, $osType);  
  16.   
  17. // Retrieve and merge the php.ini path settings  
  18. $iniPath = ini_get('include_path');  
  19. $cPath = ClassPath::concatPaths($mPath, $iniPath, $osType);  
  20. echo $cPath;  
  21. // And set the 'include_path' variables, as used by the file functions  
  22. ini_set('include_path', $cPath);  
  23. ?>  
时间: 2024-10-02 17:39:25

PHP 自动加载对象(以MVC框架为例)的相关文章

php基础知识:类与对象(2) 自动加载对象_php技巧

自动加载对象:    很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件列表.     在 PHP 5 中,不再需要这样了.可以定义一个 __autoload 函数,它会在试图使用尚未被定义的类时自动调用.通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类.  本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClas

Android 下拉刷新框架实现、仿新浪微博、QQ好友动态滑到底部自动加载

苦苦找寻的2个版本,经过测试好用.再次感谢原作者! 1.第一个版本 Android 下拉刷新框架实现 http://blog.csdn.net/leehong2005/article/details/12567757 前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但这些demo的质量参差不齐,用户体验也不好,接口设计也不行.最张没办法,终于忍不了了,自己就写了一个下拉刷新的框架,这个框架是一个通用的框架,效果和设计感觉都还不错,现在分享给各位看官. 1. 关于下拉刷新 下拉

PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间_php实例

PHP前言: •动态地创建属性和方法 •对象的复制 •对象的比较 •加载指定的文件 •自动加载类文件 •命名空间 示例 1.类的相关知识点 3(动态地创建属性和方法) class/class3.php <?php /** * 类的相关知识点 3(动态地创建属性和方法) */ // 用于演示如何动态地创建属性(这就是 php 中所谓的重载) class Class1 { // __set 魔术方法,当设置的属性不存在或者不可访问(private)时就会调用此函数 public function _

php面向对象 自动加载类 对象串行化 多态的应用

自动加载类很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把这个文件引入.不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时候,再把这个类所在的php文件导入呢?这就是我们这里

Yii2框架自动加载机制学习

Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件.你可以简单的引入这个文件,你会得到一个自动加载的支持. 在之前的文章,入口文件的介绍中,我们可以看到如下内容: // 引入 vendor 中的 autoload.php 文件,会基于 composer 的机制自动加载类require(__DIR__ .

CI框架中类的自动加载问题分析

本文实例讲述了CI框架中类的自动加载问题.分享给大家供大家参考,具体如下: application/config 配置文件中添加: | 1. Packages | 2. Libraries | 3. Helper files | 4. Custom config files | 5. Language files | 6. Models 1. 第三方库文件加载 // $autoload['packages'] = array(APPPATH.'third_party', '/usr/local/

thinkPHP5.0框架自动加载机制分析

本文实例讲述了thinkPHP5.0框架自动加载机制.分享给大家供大家参考,具体如下: 概述 ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载. 自动加载的实现由think\Loader类库完成,自动加载规范符合PHP的PSR-4. 自动加载 由于新版ThinkPHP完全采用了命名空间的特性,因此只需要给类库正确定义所在的命名空间,而命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载. 类库的自动加载检测顺序如下:

Yaf框架自动加载和路由分发的使用方法

一.自动加载(YafLoader) 1.YafLoader相关的几个配置 PHP运行时配置 yaf.use_namespace 开启命名空间 yaf.use_spl_autoload 开启之后,可由PHP的自动加载函数加载,关闭是为了高效,Yaf只加载一次. yaf.library 全局类库目录路径 Yaf应用配置 application.library 本地类库目录路径 application.library.directory 本地类库目录路径 application.library.nam

CI框架自动加载session出现报错的解决办法_php实例

很多程序员在CI中使用session的时候,开启自动加载session之后网站就报错了,具体错误信息如下:In order to use the Session class you are required to set an encryption key 下面一起来看问题解决办法. 提示信息说明:如果想用session类的话就必须要设置一个加密的密钥!那就给设置一个吧,毕竟也是出于安全考虑. 打开application/config/config.php找到Encryption Key 复制代