类的自动加载
在编写面向对象(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 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。