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:\wamp\www\testphp\autoload\index.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,比如: string 'load1' (length=5) 1 => string 'load2' (length=5) 2 => string '__autoload' (length=10) 4. spl_autoload_register自动加载+namespace命名空间 的使用 前面已经说过,自动加载现在是PHP现代框架的基石,基本都是spl_autoload_register来实现自动加载。namespace也是使用比较多的。所以spl_autoload_register + namespace 就成为了一个主流。根据PSR-0的规范,namespace命名已经非常规范化,所以用namespace就能找到详细的路径,从而找到类文件。 我们举例子来看下: AutoLoading\loading "; } public static function test() { echo __NAMESPACE__ .' static function test
'; } } 所以就会很容易找到文件,并输出: Lib static function test App\Android static function test App\Ios static function test 好了。基本自动加载的东西就讲完了。很实用的东西。 4. 同命名空间下的相互调用 在平时我们使用命令空间时,有时候可能是在同一个命名空间下的2个类文件在相互调用。这个时候就要注意,在自动调用的问题了。 比如Lib\Factory.php 和 Lib\Db\MySQL.php 我想在 Lib\Factory.php 中调用 Lib\Db\MySQL.php。怎么调用呢?以下是错误的示范: newLib\Db\MySQL(); //报错,提示说 D:\wamp\www\testphp\module\Lib\Lib\Db\MySQL.php is not exist 看到没?这种方式是在Lib\命名空间的基础上来加载的。所以会加载2个Lib。这种方式相当于相对路径在加载。 正确的做法是,如果是在同一个命名空间下平级的2个文件。可以直接调用,不用命名空间。 newMySQL();//直接这样就可以了。 newDb\MySQL();//如果有个Db文件夹,就这样。 还有一种方法就是使用 use 。使用user就可以带上Lib了。use使用的是绝对路径。 useLib\Db\MySQL; newMySQL(); 我想在 Lib\Db\MySQL.php 中调用 Lib\Register.php。怎么调用呢? 应该这样 useLib\Register; Register::getInstance(); 因为现在已经在Lib\Db这样一个命名空间了,如果你不用use,而是使用Lib\Register::getInstance()或者使用Register::getInstance()的话。将是在Lib\Db这个空间下进行相对路径的加载,是错误的。 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》 希望本文所述对大家PHP程序设计有所帮助。