一个单独的PHP类初始化文件


A separate PHP class initialization file

这是我第一次以完全OO风格进行项目。我的课看起来很乱。我发现自己在一堆类文件上执行require_once,并创建新的类实例。因此,我将所有需要和创建的实例放在一个单独的文件(init.php)中,如下所示:

<?php
require_once 'resources/config.php';
require_once 'classes/db.php';
require_once 'classes/auth.php';
require_once 'classes/msg.php';
require_once 'classes/validate.php';
require_once 'classes/view.php';
require_once 'functions/misc.php';
//DB connection
$db = new DB(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$dbConnection = $db->connect();
$msg_class = new Msg();
$validate = new Validate($dbConnection);
$msg_strings[] = array();
$view = new View($dbConnection);
?>

现在我只是在这个文件上做require_once

我没有在几页中使用View类。那么,如果我不打算使用类的实例,那么创建类的实例是不是一种糟糕的做法,对性能也不好?

最佳实践通常是使用autoloader,PHP为此提供了一个出色的自动加载器-SPL自动加载器:http://php.net/manual/en/function.spl-autoload-register.php

你可以创建一个回调,当找不到类时,PHP会自动调用该回调,在这个回调中,你可以要求/包括PHP搜索类的文件夹路径,你也可以注册多个自动加载器,这些自动加载器将按照定义的顺序调用,例如下面的-

function auto_loader($classname) {
    //search in the classes folder for a class file.
    include 'classes/' . $classname . '.php';
}
function auto_load_somethingelse($class){
  //include here
}
//register the autoloaders
spl_autoload_register('auto_loader');
spl_autoload_register('auto_load_somethingelse');

将其放在调用init.php文件的文件顶部,自动加载器在找到需要自动加载的类时就会被调用。