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:单例模式的多功能数据库工具类

    此数据库工具类根据传智播客2018年8月的PHP教程所设计。...

    2022年 10月 28日
    45
  • PHP:in_array()和array_search()的奇葩问题

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

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

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

    2022年 10月 25日
    34
  • PHP类:$this和self关键字

    $this是指向对象的指针,self是指向当前类的指针。 来一个案例 $this只能在成员方法中使用。self既可以在成员方法中使用,也可以在静态方法中使用,用来调用类的常量、静态属性和方法。 若在静态方法中调用$this关键...

    2022年 10月 19日
    35
  • PHP连接数据库:使用类和函数两种方式

    PHP连接数据库是非常常用的功能,在初学时,一般使用函数来连接。 函数的方式非常简单,如果不需要报错信息的话,只有2行代码,加上报错信息,也只有6行而已。 我们尝试定义一个类来连接数据库,如下所示: 好家伙,...

    2022年 10月 20日
    54

发表回复

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