使用spl_autoload_register()函数实现自动加载类文件

  类文件/classes/a/Human.class.php代码
<?php

namespace classes\a;

class Human
{
    private $name = '张三';

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
}
 
  类文件/classes/b/Human.class.php代码
<?php

namespace classes\b;

class Human
{
    private $name = '李四';

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
}
 
  实现自动加载类文件
<?php
// spl_autoload_register()函数可以多次调用,即可以注册多个自动加载函数,谁先注册谁先调用
spl_autoload_register(
    /**
     * 自动加载函数(匿名函数)
     *
     * @param string $class 类名
     * @return bool true=加载成功|false=加载失败,返回true会阻止调用下一个自动加载函数(如果注册了多个的话)
     */
    static function ($class) {
        $class = str_replace('\\', DIRECTORY_SEPARATOR, $class);
        $file = __DIR__ . "/{$class}.class.php";
        if (file_exists($file)) {
            require_once $file; // require类文件
            return true;
        }

        return false;
    }
);

use classes\a\Human as HumanA;
use classes\b\Human as HumanB;

// 由于没有手动require对应的类文件,实例化下面两个类时会因找不到类而触发调用自动加载函数
$humanA = new HumanA(); // 这里会将“classes\a\Human”作为{$class}参数传给自动加载函数,而不是“HumanA”
$humanB = new HumanB(); // 这里会将“classes\b\Human”作为{$class}参数传给自动加载函数,而不是“HumanB”

$nameA = $humanA->getName();
$nameB = $humanB->getName();

echo "俺叫{$nameA}。" . PHP_EOL; // 俺叫张三。
echo "俺叫{$nameB}。" . PHP_EOL; // 俺叫李四。

Copyright © 2023 码农人生. All Rights Reserved