PHP类的自动加载函数:spl_autload_register()

一个PHP项目里通常有许多个类(class),如果在每个PHP页面的开头进行引入,非常麻烦,尤其是不同的PHP页面需要不同的类。

因此,PHP7之前,有__autoload()函数用于自动引用类,PHP7之后则改为了spl_autload_register()函数。

自动加载的准备工作

我们在项目文件夹./public和./libs下分别存放了一些类,并且使用固定的名称格式“ClassName.class.php”,其中,位于./libs文件夹的Company.class.php内容如下

//位于.libs文件夹里的Company.class.php的内容
class Company{
    private $name;
    private $created;
    public function __construct($name1,$created1){
        $this->name = $name1;
        $this->created = $created1;
        echo "{$this->name}创建于{$this->created}年";
    }
}

使用有名函数进行自动加载

//项目文件内容
spl_autoload_register("func1");
spl_autoload_register("func2");
function func1($classname)
{
    $filename = "./public/$classname.class.php";
    if (file_exists($filename)) {
        require_once($filename);
    }
}
function func2($classname)
{
    $filename = "./libs/$classname.class.php";
    if (file_exists($filename)) {
        require_once($filename);
    }
}

$obj1 = new Company("山可唠", "2016");

输出:山可唠创建于2016年

逻辑不难理解:当我们创建了一个名为Company的对象时,PHP发现页面内并没有相关的类(class)定义,于是调用spl_autoload_register()函数进行查找,从func1查找到func2,如果项目文件夹内有对应名称的定义文件,则require进来,完成对象的创建,Company类里的构造函数根据我们传入的值,输出了“山可唠创建于2016年”。

使用匿名函数进行自动加载

有名函数很容易理解,但是代码比较繁琐,于是出现了更加精简的匿名函数方式。

spl_autoload_register(function($classname){
$arr = array(
"./libs/$classname.class.php",
"./class/$classname.class.php"
);
foreach ($arr as $filename){
if(file_exists($filename)){
require_once ($filename);
}
}
}
);
$obj1 = new Shinecloud("山可唠", "2016");

逻辑和有名函数是一样的,只是在写法上作了改动:建立一个$arr数组对象,将包含了类的地址存入其中,再使用foreach进行遍历,若文件存在,则引入。

如何选择使用

很明显地,如果项目体量大,类文件存在不同的文件夹内,且有不同的命名规则,使用匿名函数会更加简单、快速;如果只是个人项目,只使用单个文件夹存放固定格式的类,用有名函数就足矣。

原创文章,作者:STEVE,如若转载,请注明出处:https://shinecloud.com.cn

(0)
上一篇 2022年 10月 20日 上午12:06
下一篇 2022年 10月 23日 上午3:12

相关推荐

  • PHP:in_array()和array_search()的奇葩问题

    近期做项目,发现使用array_search出现的问题——搜索出错,元素分明有在数组中,但给出的结果是FALSE! 操作逻辑如下 从数据库中取出符合条件的字符串的用户id合集 使用foreach遍历这些对象 将对象中的字符串使用e...

    2022年 11月 20日
    139
  • 基于JQuery的AJAX异步文件上传方法

    对于许多初学者而言,上传表单很容易,但上传文件就麻烦了。 这里给出一个简单的方法,供参考。 HTML部分 谨记:action可以留空,enctype要设为“multipart/form-data” Javascript部分 PHP部分 如果不出意外,你的...

    2022年 11月 8日
    139
  • PHP:数组变量的序列化和反序列化

    序列化和反序列化是PHP操作数据库、读写文件时常见的操作。 序列化,就是将PHP的变量转化为可保存的、可传输的字符串的过程; 反序列化,则是将(序列化的)字符串转化回变量。 比如,我们需要将某学生的个人信息...

    2022年 10月 25日
    82
  • CentOS 开放端口和防火墙配置

    CentOS 快速开放端口 CentOS升级到7之后,无法使用iptables控制Linuxs的端口,Centos 7使用firewalld代替了原来的iptables。此方案实测也适用于CentOS Stream 9。 查看防火墙状态 查询放行端口列表 开启端口(以...

    2022年 11月 7日
    178
  • PHP常量:Const和Define有什么区别?

    在初学PHP时,我对这两个函数有点迷糊,虽然知道如何使用,但不知道设计这两个有什么意义。 Const const是一种语言结构,最早只能用在类(class)内,PHP5.3之后可以用在类外,实现了通用。 Define define是一个...

    2022年 10月 19日
    136

发表回复

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