PHP中的自动加载操作实现方法分析
发布时间:2022-06-30 14:24:28 所属栏目:PHP教程 来源:互联网
导读:本文实例讲述了PHP中的自动加载操作实现方法。分享给大家供大家参考,具体如下: what is 自动加载? 或许你已经对自动加载有所了解。简单描述一下:自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加
本文实例讲述了PHP中的自动加载操作实现方法。分享给大家供大家参考,具体如下: what is 自动加载? 或许你已经对自动加载有所了解。简单描述一下:自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加载导入进来。这是php5.1.2(好像是)版本新加入一个功能,他解放了程序员的双手,不需要手动写那么多的require,变得有那么点智能的感觉。 自动加载可以说是现代PHP框架的根基,任何牛逼的框架或者架构都会用到它,它发明出来的理由是啥呢?一个字:懒。因为项目越来愈大,相关联的类库文件越来越多,我们不可能再像小项目那样在一个文件中全部手动一个一个require。 如何才能自动加载呢? PHP 5.2版本更新了自动加载需要的一个魔术方法——__autoload($class_name) 正是这个神奇的内置魔术函数,才能让我们这些屌丝偷懒。我们来看下这个如何使用它。 1. 自动加载的原理以及__autoload的使用 自动加载的原理,就是在我们new一个class的时候,PHP系统如果找不到你这个类,就会去自动调用本文件中的__autoload($class_name)方法,我们new的这个class_name 就成为这个方法的参数。所以我们就可以在这个方法中根据我们需要new class_name的各种判断和划分就去require对应的路径类文件,从而实现自动加载。 我们先一步步来,看下__autoload()的自动调用,看个例子: index.php $db =new DB(); 如果我们不手动导入DB类,程序可能会报错,说找不到这个类: Fatal error: Class 'DB' not found in D:wampwwwtestphpautoloadindex.php on line 3 那么,我们现在加入__autoload()这个方法再看看: $db =new DB(); function __autoload($className) { echo $className; exit(); } 根据上面自动加载机制的描述,你分析下会输出什么? 没错:肯定是输出:DB, 也就是我们需要new 的类的类名。所以,这个时候我们就可以在__autoload()方法里,根据需要去加载类库文件了。 index.php $db =new DB(); function __autoload($className) { require $className .'.php'; } DB.php class DB { publicfunction __construct() { echo 'Hello DB'; } } 这样子我们就很轻松的将我们需要new 的class 全部导入了进来,这样子,我们就可以轻松的new N个class,比如: <?php function __autoload($className) { require $className .'.php'; } $db =new DB(); $info =newInfo(); $gender =newGender(); $name =newName(); //也是支持静态方法直接调用的 Height::test(); 先看下它如何使用吧: 当我们去new一个找不到的class时,PHP就会去自动调用sql_autoload_resister注册的函数,这个函数通过它的参数传进去: sql_autoload_resister($param) 这个参数可以有多种形式: sql_autoload_resister('load_function'); //函数名 sql_autoload_resister(array('load_object', 'load_function')); //类和静态方法 sql_autoload_resister('load_object::load_function'); //类和方法的静态调用 //php 5.3之后,也可以像这样支持匿名函数了。 spl_autoload_register(function($className){ if (is_file('./lib/' . $className . '.php')) { require './lib/' . $className . '.php'; } }); index.php function load1($className) { echo 1; require $className .'.php'; } spl_autoload_register('load1');//将load1函数注册到自动加载队列中。 $db =new DB();//找不到DB类,就会自动去调用刚注册的load1函数了 上面就是实现了自动加载的方式,我们同样也可以用类加载的方式调用,但是必须是static方法: class autoloading { //必须是静态方法,不然报错 public static function load($className) { require $className .'.php'; } } //2种方法都可以 spl_autoload_register(array('autoloading','load')); spl_autoload_register('autoloading::load'); $db =new DB();//会自动找到 需要注意的是,如果你同时使用spl_autoload_register和__autoload,__autoload会失效!!! 再说了,本来就是替换它的,就一心使用spl_autoload_register就好了。 if(is_file($className .'.php')){ require $className .'.php'; } } function load2($className) { echo 2; if(is_file('./app/'. $className .'.php')){ require'./app/'. $className .'.php'; } } function __autoload($className) { echo 3; if(is_file('./lib/'. $className .'.php')){ require'./lib/'. $className .'.php'; } } //注册了3个 spl_autoload_register('load1'); spl_autoload_register('load2'); spl_autoload_register('__autoload'); 123Hello Info 我们分析下: new DB的时候,就按照注册顺序,先去找load1()函数了,发现找到了,就停止了,所以输出1 Hello Word new Info的时候,先是安装注册顺序,先找load1(), 所以输出了1,发现没找到,就去load2()里面去找,所以输出了2,还是没这个文件,就去__autoload()函数里找,所以,先输出了3,再输出Hello Info 注意,前面说过,spl_autoload_register使用时,__autoload会无效,有时候,我们希望它继续有效,就可以也将它注册进来,就可以继续使用。 (编辑:开发网_开封站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |