类的自动加载

在编写面向对象(OOP) 程序时,通常是一个类新建一个 PHP 文件。 然而,在调用其他类的时候都需要去包含(include或require)这个类所在的php文件。

有没更简单的方法呢,答案当然是 有!!!

使用 spl_autoload_register() 函数注册任意数量的自动加载器。

开始一个面向对象的项目

目录结构为:

├── app
│   ├── Application.php
│   └── utils
│       └── Debug.php
├── bootstrap
│   └── autoload.php
├── index.php

bootstrap/autoload.php 文件中,注册自动加载的实现函数。

<?php
spl_autoload_register(function ($className) {
    $classNamePath = (defined('ROOT_DIR') ? ROOT_DIR : __DIR__) . '/' . str_replace("\\", "/", $className) . '.php';
    if (!file_exists($classNamePath)) {
        throw new \Exception('Unable to load ' . $className);
    }
    require_once $classNamePath;
});

这里注册的是匿名函数,当然你也可以注册一个非匿名函数的函数名,或者一个类的方法。

app/Application.php 中是应用的主文件。

<?php

namespace app;

class Application
{
    static function run()
    {
        echo 'This is my first App';
    }
}

app/utils/Debug.php 是一个工具包。

<?php

namespace app\utils;

class Debug
{
    static function dump($var, $echo = true)
    {
        $output = var_export($var, true);
        if ($echo) {
            echo $output;
            return '';
        }
        return $output;
    }
}

最后在入口文件index.php中,去运行这个应用

<?php
define('ROOT_DIR', __DIR__);
require __DIR__ . '/bootstrap/autoload.php';

\app\Application::run();

\app\utils\Debug::dump('This is a tool package');

可以看出,在调用Application Debug 类的时候,无须一个个的包含文件了。

这样就实现了类的自动加载的一个面向对象的项目的构建。

有关spl_autoload_register() 的更多用法,请参考 官方手册

最后

上面的内容,只是简要说明自动加载的实现方法,了解其原理即可。

强烈推荐使用 composer 来管理php文件。

Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。