自动加载

很多的小伙伴在,学习 PHP 的时候最早面对的问题之一就是 require 、 include 和 require_once 、include_once。

include 和 require 是PHP中引入文件的两个基本方法。在小规模开发中直接使用 include 和 require 还是可以的,但在大型项目中会造成大量的 include 和 require 堆积,这样的代码既不优雅,执行效率也很低,而且维护起来也相当困难。

include 和 require 功能是一样的,它们的不同在于 include 出错时只会产生警告,而 require 会抛出错误终止脚本。
include_once 和 include唯一的区别在于 include_once 会检查文件是否已经引入,如果是则不会重复引入。
require_once和require唯一的区别在于 require_once 会检查文件是否已经引入,如果是则不会重复引入。

在 PHP 5 中,已经不再需要这样了。 spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

TIPS

尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_register() 函数。 spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。

__autoload() 函数实例

首先新建一个test.php文件、myclass文件夹和$a.class.php文件(在myclass文件夹内)

test.php
<?php
header("content-type:text/html;charset=utf-8");
function __autoload($a){ //$a就是加载的类名
    var_dump($a);
    include 'myclass/' . $a . '.class.php';
}
class A extends B
{

}

B.class.php
<?php
header("content-type:text/html;charset=utf-8");
class B
{

}

spl_autoload_register()的参数

需要注册的自动装载函数
如果没有找到参数1的函数,是否抛出异常错误
是否把参数1的函数添加到队列之首

首先新建一个test.php文件、myclass文件夹和$a.class.php文件(在myclass文件夹内)

test.php
<?php
header("content-type:text/html;charset=utf-8");
function myLoader($a){ //$a就是加载的类名
    include 'myclass/' . $a . '.class.php';
}
spl_autoload_register('myLoader',true,true);
class A extends B
{

}

B.class.php 
<?php 
header("content-type:text/html;charset=utf-8"); 
class B 
{
}

类的方法传入

首先新建一个test.php文件、myclass文件夹和$a.class.php文件(在myclass文件夹内)
<?php
header("content-type:text/html;charset=utf-8");
test.php
class MyLoader
{
    public static function loader($a){
        include 'myclass/' . $a . '.class.php';
    }
}
//第一个参数以数组方式传入
spl_autoload_register(['MyLoader','loader'],true,true);
class A extends B
{

}

B.class.php 
<?php 
header("content-type:text/html;charset=utf-8"); 
class B 
{
}

总结

自动加载

原创文章,作者:许小珂,如若转载,请注明出处:https://www.xuxiaoke.com/phpclass/147.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注