maxcad, Тоже не люблю видеоуроки. Но Дмитрия Елисеева стоит и читать, и смотреть: хорошо прочищает мозги PHP-разработчиков. А текстовых материалов, объясняющих на таком уровне всю тему устройства фреймворков, я не встречал. Отдельные компоненты - да. Но не в комплексе.
Так автозагрузка и контейнер DI - это и есть способы избавится от include. Когда без include автоматически загружается ровно то, что нужно. Когда контейнер внедрения зависимостей сам подтягивает параметры из конфигурации и подставляет их в создаваемый объект...
Объекты не создаются в коде с помощью new. Вместо этого производится запрос к контейнеру внедрения зависимостей с именем класса создаваемого объекта. И уже внутри контейнера создаётся (вот здесь - через new) требуемый объект (или отдаётся уже существующий, если это не первый запрос объекта этого класса), создаются объекты, от которых запрашиваемый объект зависит, создаваемым объектам передаются параметры конфигурации... И всё это делается автоматически.
И создаваемые объекты вообще ничего не знают о том, откуда конфигурация берётся.
Лентюй, Хотите быть в курсе - посмотрите видеоуроки, которые я советую в ответе. Там очень хорошо объясняется, как устроены современные фреймворки и почему они устроены именно так.
Лентюй, Вопрос был "как избежать инклюдов?". И единственный правильный ответ на него: не использовать include сверх минимально необходимых двух-трёх include на весь код сайта. А автозагрузка, DI и прочее - это объяснение того, как именно их не использовать.
И если вам не нравятся ответы, данные на этот вопрос, то почему вы не написали свой ответ?
Genri_Rus, Тут как раз отсутствие интерполяции - прямая подстановка значения переменной. Точно так же, как это было бы написано в PHP-коде (только там было бы $value и '.' вместо '~').
Лентюй, Не вижу в исходном вопросе ничего вами перечисленного. Наоборот, текст вопроса свидетельствует о том, что его автор ничего об автозагрузке не знает.
Лентюй, Но этот include находится в единственном месте кода сайта и срабатывает только в том случае, если идет запрос к ещё не загруженному сайту. Вместо явно прописываемого во множестве файлов геморроя (а не забыли ли мы что-то и не подключили ли что-то лишнее? а в каких ещё местах надо поменять include при изменении кода?) управление загрузкой передаётся самому PHP.
Фактически, программисту остаётся только задать, откуда грузить. Но даже этого не требуется, если используется Composer, автоматически создающий автозагрузчик.
Если честно, то я просто набрал в Google: twig конкатенация строк и получил множество рецептов, сводящихся к тому, что операция конкатенации: ~
Насколько понимаю, {{ ... }} - это вывод значения переменной (аналог <?= ... ?> в PHP). Но как это работает внутри {% ... %}, непонятно. Так что правилен вариант без {{...}}.
Так ведь запрос внутри ANY должен возвращать единственный столбец - значения которого будут использованы в условном выражении. И работает это совсем не так: www.mysql.ru/docs/gruber/mg13.html
А from Pass_in_trip, Passenger без связи в where между Pass_in_trip и Passenger вернёт декартово произведение таблиц, продублировав каждую строку Passenger столько раз, сколько строк в Pass_in_trip.
Сергей Горностаев, Грабли - это то, на что приходится наступать в процессе освоения языка. Да, возможно для создателей языка это решение было логичным. И для тех, кто не знаком с другими языками, оно кажется логичным. Но для тех, кто переходит на Python с C++, PHP, JavaScript (а ведь в JS тоже "всё-объект") и т.д. по списку, такое поведение логичным никак не выглядит. И, безусловно, оно является потенциальным источником трудно обнаруживаемых ошибок, допускаемых просто по невнимательности.
mkone112, То, что значение по умолчанию, подставляемое при следующих вызовах функции, можно изменить внутри функции - в каких ещё языках программирования есть такой источник ошибок?
mkone112, В данном случае "грабли" - это нелогичности, о которые спотыкаются программисты, пытающиеся перейти на Python c других языков. Поведение дефолтных значений в Python полностью противоречит другим языкам программирования.