Лучший способ включить файл в PHP? - PullRequest
5 голосов
/ 23 марта 2011

В настоящее время я разрабатываю веб-приложение на PHP, и мне хотелось бы знать, как лучше всего включить файлы (include_once) таким образом, чтобы код по-прежнему можно было обслуживать. Под maintanable я подразумеваю, что если я хочу переместить файл, то было бы легко выполнить рефакторинг моего приложения, чтобы оно работало должным образом.

У меня много файлов, так как я стараюсь использовать хорошие методы ООП (один класс = один файл).

Вот типичная структура класса для моего приложения:

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 ]

6 голосов
/ 23 марта 2011

Я использовал для запуска всех моих php-файлов с:

include_once('init.php');

Тогда в этом файле мне потребуются_конце все остальные необходимые файлы, например, functions.php или globals.php, где я объявлю все глобальные переменные или константы. Таким образом, вам нужно всего лишь отредактировать все настройки в одном месте.

4 голосов
/ 23 марта 2011

Это зависит от того, что именно вы пытаетесь достичь.

Если вы хотите иметь настраиваемое отображение между файлами и каталогами, в которых они находятся, вам нужно разработать абстракцию пути и реализовать некоторые функции загрузчика для работы с этим. Я сделаю пример.

Допустим, мы будем использовать нотацию типа Core.Controls.Control для ссылки на (физический) файл Control.php, который будет найден в (логическом) каталоге Core.Controls. Нам нужно сделать реализацию из двух частей:

  1. Сообщите нашему загрузчику, что Core.Controls сопоставлен с физическим каталогом /controls.
  2. Поиск Control.php в этом каталоге.

Итак, вот начало:

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');

Конечно, этот пример - это минимум, который делает что-то полезное, но вы можете видеть, что он позволяет вам делать.

Извиняюсь, если я допустил небольшие ошибки, я набираю это на ходу. :)

...