首页 > 编程笔记 > PHP笔记 阅读:12

PHP __autoload()和spl_autoload_register():自动加载类文件

很多时候写面向对象的应用程序时会对每个类的定义建立一个 PHP 源文件,一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件),对于每一个类文件都需要使用 require 或者 include 引入。

PHP 中提供了两个可用来自动加载文件的函数 __autoload() 和 spl_autoload_register() 函数。

__autoload() 方法

当在代码中尝试加载未定义的类时会触发 __autoload() 函数,语法如下:

void __autoload ( string $class )

其中,class 是待加载的类名,该函数没有返回值。

下面演示如何使用 __autoload() 方法。假设有两个文件,分别为 myclass.php 和 yourclass.php。

myclass.php 代码:
<?php
class myclass{
    function myname(){
        echo "My name is PHP<br />";
    }
}
?>

yourclass.php 代码:
<?php
class yourclass{
    function yourname(){
        echo "Your name is C语言中文网<br />";
    }
}
?>

另外,在同一目录下写一个 autoload.php 文件,其中的代码如下:
<?php
function __autoload($name){
    if(file_exists($name . ".php")){
        require_once $name . '.php';
    } else {
        echo "The path is error";
    }
}
$my = new myclass();
$my->myname();
$your = new yourclass();
$your->yourname();
?>
执行 autoload.php 文件,输出结果为:

My name is PHP
Your name is C语言中文网

当语句运行到 $my=new myclass() 和 $your=new yourclass() 时便会调用 __autoload() 函数,在 __autoload() 函数里实现了把相应类文件加载进来的功能。

spl_autoload_register() 函数

PHP 还提供了 spl_autoload_register() 函数,可实现自动加载,以及注册给定的函数作为 __autoload() 的实现。

spl_autoload_register() 函数的语法如下:

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

autoload_function 是要注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数 spl_autoload()。

throw 参数设置了 autoload_function 无法成功注册时 spl_autoload_register() 是否抛出异常,若 throw 为 true 或未设置值,则抛出异常,为 false 则不抛出。

prepend 如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

假设当前目录下存在 myclass.php 和 yourclass.php,并且两个文件中的代码和上例相同,此时我们将 autoload.php 中的代码改为如下内容:
<?php
function my_autoloader($class) {
    include $class . '.php';
}
spl_autoload_register('my_autoloader');
//自PHP 5.3.0起, 可以使用一个匿名函数
//spl_autoload_register(function ($class) {
//include $class . '.php';
// });
$my = new myclass();
$my->myname();
$your = new yourclass();
$your->yourname();
?>
此时运行 autoload.php,执行结果为:

My name is PHP
Your name is C语言中文网

编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员!

编程帮二维码
微信扫描二维码关注

所有教程

优秀文章