Подключение необходимых файлов проекта PHP

131
19 августа 2018, 12:10

Экосистема: PHP 7.1, самописный проект, я основной разработчик, программист С/С++

Есть проект, имеющий банальную структуру:

  • index.php (+mod_rewrite на него всех URL)
  • /classes (куча файликов в папках и подпапках с описанием функций и классов)

Проект работает, все в порядке. Однако есть проблема - количество файлов растет. Я подключаю каждый новый файл через require_once(...) и их уже накопилось под сотню. Меня это не беспокоило

На днях встала задача интегрировать в мой проект разработки прошлых лет, который оформлены в виде иерархии классов, коих порядка 50+, каждый класс в своем файлике, в своем namespace, разделены по подпапкам, все очень логично и понятно

Я в лоб сделал find . -name "*.php" и прописал все в requre_once(), как обычно делал. Проверил, начали сыпаться трейсы PHP по поводу того, что какому-то классу нужен другой класс, от которого этот наследуется. Путем магических перестановок порядка подключения я добился того, что все заработало

Но я считаю такой подход не научным, не красивым

Вопрос:

  1. Как в PHP принято решать проблемы зависимостей между классами и порядком подключения файлов?
  2. Как реализуется в PHP это подключение? Желательно именно нативный вариант, а не вариант определенного фреймворка

Интересует два момента: быстродействие подключения/выполнения кода и удобство/безопасность реализации

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

Answer 1

Попробуйте автозагрузку классов: http://php.net/manual/ru/language.oop5.autoload.php Вот пример:

<?php
spl_autoload_register(function ($class_name) {
    include $class_name . '.php';
});
$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>

Т.е. вы регистрируете функцию которая будет загружать ваши файлы с классами. В данном примере при выполнении new MyClass1() будет автоматически выполнен include MyClass1.php. Аналогично для MyClass2() будет include MyClass2.php

READ ALSO
Script timed out before returning headers

Script timed out before returning headers

У меня на сервере установлена CentOS и панель CWPТам крутится 1 сайт

215
Генерация qrcode

Генерация qrcode

Как можно сгенерировать на php qrcode биткоин по его адресу, например для этого? 15v3Wm3sDUht2VtgtLyvUxdcTw6pAwGaA5?

169
Как вывести значения массива?

Как вывести значения массива?

Столкнулся с проблемой, необходимо вывести несколько раз один и тот же элемент массива, один раз получается вывести Red

148
Почему не срабатывает php в Visual composer?

Почему не срабатывает php в Visual composer?

Пробовал вставить php-код через HTML-box в Visual Composer, не срабатывает

165