Когда дело доходит до PHP, многие разработчики любят язык, многие разработчики ненавидят язык, и многие разработчики обычно просто используют его для выполнения своей работы.
Для чего это стоит, я из последнего лагеря. Я думаю, что PHP в порядке. Как и все, это не без проблем, но мне нравится работать с ним достаточно хорошо, и я рассматриваю это как способ сделать работу по сравнению с каким-то языком «в небе» в течение некоторого времени утопии развития.
Дело в том, что одна из вещей, которые любят разработчики в PHP — его особенности и гибкость — это те вещи, которые часто сбивают нас с толку. Список длинный, но в мире WordPress одна из самых распространенных проблем — правильный способ включения внешних файлов.
PHP предлагает четыре (!) Способа сделать это, а WordPress даже предлагает свой вариант.
В этой статье мы рассмотрим четыре способа, которые предлагает PHP для включения файлов, рекомендации по использованию каждого из них и рассмотрим возможности WordPress для включения файлов.
Включая файлы с PHP
Вообще говоря, включение файлов с PHP относится к действию включения другого сценария в контекст сценария, над которым вы сейчас работаете.
Вы можете думать об этом как об импорте файла, так что когда файл возвращается с сервера, сценарии объединяются вместе в том порядке, в котором они включены, и затем интерпретируются как один файл.
Сначала мы рассмотрим способы включения файлов в PHP и последствия каждого из них. В конце статьи мы рассмотрим, когда нам следует это делать.
include()
Согласно руководству по PHP:
include () включит и оценит указанный файл. Если файл не найден, появится предупреждение PHP.
Проще говоря, это означает, что PHP будет искать файл, который вы пытаетесь включить. Если он найден, он будет добавлен в ваш скрипт в том месте, где вы его объявили.
Это важно понимать. Например, допустим, вы пишете набор функций, которые зависят от предыдущего набора функций. В этом случае вам нужно убедиться, что другой файл включен первым.
С другой стороны, если вы хотите ввести набор функций или внешний файл в середине существующей функции, то вы можете включить его именно там, где вам нужно.
Во-вторых, обратите внимание, что если файл отсутствует, PHP выдаст предупреждение. В зависимости от конфигурации сервера это может отображаться в браузере или записываться в файл журнала (или в оба).
Тем не менее, предупреждения просто так — они не считаются фатальными и, как правило, не останавливают выполнение, но их важно отметить, поскольку обычно это означает, что часть вашей работы не загружается и / или не интерпретируется должным образом.
Наконец, обратите внимание, что когда файл загружается с помощью include()
, он будет иметь доступ ко всем переменным, ранее определенным в вашем существующем скрипте.
Например, скажем, что вы работаете над функцией и в середине этой функции вы собираетесь включить отдельный файл. Этот отдельный файл будет иметь доступ к переменным, определенным ранее в функции, в которую он включен.
Хотя это может показаться удобным, но внешний сценарий немного неясен, поскольку не обязательно показывает, что он зависит от переменных, определенных извне. Это может сбивать с толку, особенно при работе с командой.
include_once()
Взято прямо из руководства по PHP:
include_once () будет выполнять то же поведение, что и include (), но не будет включать файл снова, если он уже был включен.
Очевидно, что не нужно тратить столько времени на обсуждение общих моментов include_once()
, но есть несколько ключевых отличий между тем, как работает include_once()
и тем, как работает include()
.
Во-первых, в то время как include_once()
работает в основном так же, как include()
, он не позволит вам снова включить скрипт. Это означает, что если где-то еще в вашем проекте был включен внешний файл, это определенное место, в котором этот файл был включен.
Так в чем же преимущество? Помимо гарантии того, что сценарий включен только в одно место, он также гарантирует, что переменные и функции не обязательно будут переопределены. Напомним, что при использовании include()
скрипты имеют доступ к функциям и переменным, которые определены над ними.
Если вы решите определить новый набор переменных или функций в файле, включить его в другой скрипт и не использовать include_once()
, то вы рискуете переопределить функции и переменные, которые могут вызвать серьезные проблемы с выполнением код.
Требование файлов с PHP
Запрос файлов аналогичен включению файлов в том смысле, что это еще один способ включения сценария в сценарий, который вы в настоящее время пишете, но он имеет ряд собственных последствий, связанных с ошибками и безопасностью.
Несмотря на то, что вы можете рассматривать требование наличия файла во многом так же, как вы можете включить файл, это означает, что он сильнее — то есть внешний файл необходим для выполнения.
Как мы увидим, это именно тот случай.
require()
Еще раз, прямо из руководства по PHP:
require () выполняет то же самое, что и include (), но выдает PHP-фатальную ошибку, если файл не найден.
Так что вот что нужно с require()
: он будет выполнять то же действие, что и include()
если импортировать внешний скрипт в контекст того, над которым вы работаете, но если ему не удается найти файл, он выбрасывает ошибка и полностью останавливает выполнение.
Это означает, что ваше приложение останавливается. С помощью include()
вы получите предупреждение и попытаетесь продолжить работу.
На некотором уровне может показаться, что наличие файлов — это правильный путь. В конце концов, зачем вам рисковать включением чего-то, чтобы просто получить предупреждение о возможной ошибке в приложении.
Но все зависит от того, над чем вы работаете. Иногда простые предупреждения PHP — это нормально — например, забывание инициализировать индекс массива — в других случаях вам нужна ошибка.
Не существует жестких и быстрых правил, когда использовать это по сравнению с включениями, но критически подумайте о характере того, что вы делаете, и последствиях, которые он несет, если он потерпит неудачу.
require_once ()
Наконец, из руководства по PHP:
require_once () выполняет то же самое, что и require (), но не будет включать файл во второй раз, если он уже включен.
Возможно, это легче всего понять, поскольку мы рассмотрели последние три функции относительно подробно. Проще говоря, require_once()
выполняет те же функции, что и require, хотя и не будет пытаться снова включить файл, если он уже загружен в ваш скрипт.
Эмпирические правила
В дополнение к критическому размышлению над тем, какая функция лучше всего подходит для вашего проекта, вот два дополнительных практических правила, которые следует учитывать при работе с include()
и require()
:
-
require_once()
лучше подходит для больших сайтов, так как на более низком уровне выполняет дополнительную работу, которая влияет на безопасность и производительность. -
include_once()
работает быстрее и обычно считается приемлемым для небольших сайтов
Достаточно просто, но как насчет вспомогательных функций WordPress?
Включая файлы с WordPress
Учитывая все вышесказанное, существуют более эффективные способы, чем использование include()
и require()
для включения шаблонов в ваши проекты WordPress.
Скажем, например, что у вас есть несколько файлов циклов — один для формата записи:
- петля-standard.php
- петля-image.php
- петля-quote.php
И вам нужно включать их в single.php всякий раз, когда вы работаете над отдельной страницей поста темы.
В какой-то момент было приемлемо сделать что-то вроде этого:
1
|
include_once( ‘loop-standard.php’ );
|
Но это уже не лучшая практика.
get_template_part()
WordPress теперь предлагает функцию get_template_part()
, которая является частью нативного API и используется специально для повторного использования разделов или шаблонов кода (кроме заголовка, нижнего колонтитула и боковой панели) в вашей теме.
Функция принимает два аргумента:
- Первый аргумент — это шаблон для шаблона. В приведенном выше примере это будет «
loop
». - Второй аргумент — это имя шаблона. В приведенном выше примере это будет «
standard
», «quote
» или «image
».
Придерживаясь нашего примера выше, допустим, что мы находимся в Цикле и хотим включить шаблон формата публикации цитаты. В этом случае мы бы сделали следующее:
1
2
3
4
5
|
if( ‘quote’ == get_post_format() ) {
get_template_part( ‘loop’, ‘quote’ );
}
|
Или, предполагая, что вы назвали свои шаблоны в соответствии с типами форматов записей, вы можете сделать что-то еще чище:
1
|
get_template_part( ‘loop’, get_post_format() );
|
Чисто, верно?
Вы можете сделать это еще дальше. Допустим, вы абстрагировали свой код пагинации в собственный файл шаблона с именем pagination.php . Используя get_template_part()
, вы можете включить это по всему сайту, скажем, в footer.php или в index.php , single.php , archives.php и т. Д., Просто добавив:
1
|
get_template_part( ‘pagination ‘);
|
Намного проще, не так ли?
Когда я должен использовать что?
Таким образом, после всего этого нам еще предстоит обсудить рекомендации о том, когда и что использовать. Я ни в коем случае не авторитет в этом, но вот правила, которым я следую:
- В разработке тем я всегда использую
get_template_part()
. - В разработке плагинов я почти всегда использую
include_once()
и обычно использую его один раз в функции. Вы можете видеть это в моих шаблонах . - Если плагин, который я пишу, будет использоваться на очень большом сайте, тогда я использую
require_once()
.
Это все!
Дальнейшее чтение
Для более подробного объяснения того, что было описано в этой статье, обязательно прочитайте справочные страницы для каждой из функций: