先看下它如何使用,在index.php中加入以下代码。
<?php spl_autoload_register(function($className){ if (is_file('./Lib/' . $className . '.php')) { require './Lib/' . $className . '.php'; } }); $db = new Db(); $db::test();
在Lib\Db.php文件中加入以下代码:
<?php class Db { public static function test() { echo 'Test'; } }
运行index.php后,当调用 new Db() 时, spl_autoload_register 会自动去lib/目录下查找对应的Db.php文件,成功后并且能够执行 $db::test(); 。同样如果在Lib\目录下有多个php类文件,都可以在index.php中直接调用,而不需要使用 require 多个文件。
也就是说, spl_autoload_register 是可以多次重复使用的,这一点正是解决了 __autoload 的短板,那么如果一个页面有多个 spl_autoload_register ,执行顺序是按照注册的顺序,一个一个往下找,如果找到了就停止。
3. spl_autoload_register自动加载和namespace命名空间
对于非常复杂的系统,其目录结构也会非常复杂,规范的命名空间解决了复杂路径下大量文件、函数、类重名的问题。而自动加载现在是PHP现代框架的基石,基本都是 spl_autoload_register 来实现自动加载。所以spl_autoload_register + namespace 就成为了一个主流。
根据PSR系列规范,namespace命名已经非常规范化,所以根据namespace就能找到详细的路径,从而找到类文件。
我们用最简单的例子来说明复杂系统如何自动加载类文件。
首先,我们准备系统目录结构:
----/Lib // 类目录 --Db.php --Say.php ----autoload.php // 自动加载函数 ----index.php // 首页
以上是一个基本的系统目录,我们要实现的是,使用命名空间和自动加载,直接在首页index.php调用Lib目录下的多个类。
我们准备两个列文件:
Db.php
<?php namespace Lib; class Db { public function __construct() { //echo 'Hello Db'; } public static function test() { echo 'Test'; } } Say.php <?php namespace Lib; class Say { public function __construct() { //echo 'Hello'; } public function hello() { echo 'say hello'; } }
以上两个普通的类文件,添加了命名空间: namespace Lib; 表示该类文件属于Lib\目录名称下的,当然你可以随便取个不一样的名字来表示你的项目名称。
现在我们来看autoload.php:
<?php spl_autoload_register(function ($class) { $prefix = 'Lib\\'; $base_dir = __DIR__ . '/Lib/'; // does the class use the namespace prefix? $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { // no, move to the next registered autoloader return; } $relative_class = substr($class, $len); // 兼容Linux文件找。Windows 下(/ 和 \)是通用的 $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; if (file_exists($file)) { require $file; } });
内容版权声明:除非注明,否则皆为本站原创文章。