Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Включение файлов

Сайты (да и любые программы) на PHP содержат тысячи, десятки тысяч и сотни тысяч строк кода (есть проекты с миллионами). В таких условиях одним файлом с кодом не обойдешься - его нужно разбивать на части. Для получения доступа к коду, который находится в других файлах, в PHP реализован механизм включения, состоящий из 4 специальных конструкций: include, include_once, require и require_once.

Как вы увидите в следующих курсах, современный стандарт разработки на PHP полагается на механизм автозагрузки и запрещает использование явного включения файлов. Данный урок нужен лишь для понимания происходящих внутри процессов, но в реальном коде за включение файлов отвечает Composer — менеджер управления зависимостями, который будем проходить в курсе про настройку окружения.

<?php

// file: print.php

function sayHi()
{
    print_r('Hi!');
}

// file: index.php

require_once 'print.php';

sayHi(); // => Hi!

Включение файла с кодом делает доступным его содержимое в том месте, куда он включается. В примере выше функция sayHi, определенная в файле print.php, становится видна из файла index.php. То же самое относится не только к определению функций, но даже к переменным.

<?php

// file: print.php

$x = 'Hi!';


// file: index.php

require_once 'print.php';

print_r($x); // => Hi!

В следующем уроке мы поговорим о том, почему такое поведение - абсолютное зло.

Последний пример наталкивает на интересную мысль. Раз переменная появилась внутри файла index.php, то это значит, что конструкция require_once исполняет весь код, который находится во включаемом файле. В этом легко убедиться поставив эксперимент:

<?php

// file: print.php

print_r("Hi from print.php!\n");


// file: index.php

require_once 'print.php';

print_r("Hi from index.php!\n");

Попробуем запустить:

$ php index.php
Hi from print.php!
Hi from index.php!

Видно, что сначала выполнился код, находящийся во включаемом файле, и только потом код в файле index.php. Фактически, можно считать, что require_once берет содержимое включаемого файла и вставляет его вместо себя. То есть код выше работает так, как будто он написан следующим образом:

<?php

// index.php

print_r("Hi from print.php!\n");
print_r("Hi from index.php!\n");

Этот механизм рекурсивен по своей природе: если во включаемом файле есть другой включаемый файл, то сначала исполнится он. Такое поведение чем-то похоже на матрешку. Можно сказать, что весь код всех файлов проекта находится в одном пространстве и доступен для использования напрямую.

Из всех четырех конструкций для включения файлов пользоваться имеет смысл только одной — require_once. Она обладает двумя важными свойствами:

  1. Если файл отсутствует, то эта конструкция приведет к ошибке, и программа остановит свое выполнение;
  2. Если в require_once передается файл, который уже был где-то загружен ранее, то она не будет выполнять этот файл повторно, но код этого файла все равно станет доступным.

Эти два условия важны, так как код, опирающийся на них, получается более качественным и простым. В отличие от require_once, остальные конструкции не отвечают этим требованиям: require исполняет включаемый файл каждый раз, а include и include_once не приводят к ошибке в ситуации, когда файла не существует.


Дополнительные материалы

  1. Composer

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».