Лучший способ включить файл в PHP?

В настоящее время я занимаюсь разработкой веб-приложения 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() { } } } 

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

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

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

  1. Core.Controls нашему загрузчику, что 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 // eg 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'); 

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

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

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

 include_once('init.php'); 

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