在PHP中包含文件的最佳方法?

时间:2011-03-23 01:59:49

标签: php include-path

我目前正在开发一个PHP Web应用程序,我想知道包含文件(include_once)的最佳方式是什么,它仍然是可维护的代码。通过maintanable我的意思是,如果我想移动一个文件,重构我的应用程序以使其正常工作是很容易的。

我有很多文件,因为我尝试了很好的OOP实践(一个类=一个文件)。

这是我的应用程序的典型类结构:

namespace Controls
{
use Drawing\Color;

include_once '/../Control.php';

class GridView extends Control
{
    public $evenRowColor;

    public $oddRowColor;

    public function __construct()
    {
    }

    public function draw()
    {
    }

    protected function generateStyle()
    {
    }

    private function drawColumns()
    {
    }
}
}

2 个答案:

答案 0 :(得分:6)

我曾经用:

开始我所有的php文件
include_once('init.php');

然后在该文件中,我将需要所有其他需要的文件,例如functions.php,或者globals.php,其中我将声明所有全局变量或常量。这样您只需在一个地方编辑所有设置。

答案 1 :(得分:4)

这取决于你想要完成的目标。

如果你想在文件和它们所在的目录之间建立可配置的映射,你需要设计一个路径抽象并实现一些加载器函数来处理它。我会做一个例子。

假设我们将使用Core.Controls.Control之类的表示法来引用(逻辑)目录Control.php中的(物理)文件Core.Controls。我们需要做两部分实现:

  1. 指示我们的Core.Controls加载器已映射到物理目录/controls
  2. 在该目录中搜索Control.php
  3. 所以这是一个开始:

    class Loader {
        private static $dirMap = array();
    
        public static function Register($virtual, $physical) {
            self::$dirMap[$virtual] = $physical;
        }
    
        public static function Include($file) {
            $pos = strrpos($file, '.');
            if ($pos === false) {
                die('Error: expected at least one dot.');
            }
    
            $path = substr($file, 0, $pos);
            $file = substr($file, $pos + 1);
    
            if (!isset(self::$dirMap[$path])) {
                die('Unknown virtual directory: '.$path);
            }
    
            include (self::$dirMap[$path].'/'.$file.'.php');
        }
    }
    

    你会像这样使用加载器:

    // This will probably be done on application startup.
    // We need to use an absolute path here, but this is not hard to get with
    // e.g. dirname(_FILE_) from your setup script or some such.
    // Hardcoded for the example.
    Loader::Register('Core.Controls', '/controls');
    
    // And then at some other point:
    Loader::Include('Core.Controls.Control');
    

    当然,这个例子是做一些有用的事情的最低限度,但你可以看到它允许你做什么。

    如果我犯了任何小错误,我会道歉,我正在打字。 :)