В настоящее время я занимаюсь разработкой веб-приложения 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
. Нам нужно выполнить двухчастную реализацию:
Core.Controls
нашему загрузчику, что Core.Controls
отображается в физический каталог /controls
. 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, где я объявлял бы все глобальные переменные или константы. Таким образом, вам нужно только отредактировать все настройки в одном месте.