Почему не рекомендуется ставить закрывающийся тег в PHP файлах
Почему в php файлах не рекомендуется ставить закрывающийся тег?
Во время написания кода на PHP, весь код, который находится после закрывающегося тега ?>, будет рассматриваться как простой текст и не будет интерпретироваться как код PHP. Поэтому закрывающийся тег ?> часто опускается в PHP файлах, чтобы избежать возможных ошибок и проблем, связанных с этим.
Пропускание закрывающегося тега также помогает избежать случайного вывода неправильного символа, который может появиться перед закрывающим тегом. Это может произойти из-за пробелов или переводов строк, которые могут быть скрыты или незаметны в коде.
Опускание закрывающегося тега также упрощает работу с буферизацией вывода. Если закрывающийся тег присутствует в файле, могут возникнуть проблемы с выводом и управлением буферизацией, так как это может вызвать предварительный вывод данных до того, как разработчик этого хочет.
Тест по PHP: Синтаксис
Начнём мы с для кого повторения, для кого изучения темы “PHP Основы” и сегодня разберём основы синтаксиса (правил написания PHP скриптов).
Сначала предлагаю вам пройти тест, оценить свои знания. Не забудьте отписаться и кинуть свой результат в комментариях! Даже если результат будет неудовлетворительным! 🙂
После прохождения теста, предлагаю вам ознакомиться с каждым вопросом и обсудить ответы!
Вопрос 1
Вопрос: Заполните фразу: PHP (от англ. _______________) это _________ язык программирования, основанный на технологии _________
Варианты ответов:
- «PHP: Hypertext Preprocessor», «скриптовый язык», «Zend»
- «PHP: Hypertext Preprocessor», «скриптовый язык», «PHP»
- «PHP: Hypertext Preprocessor», «функциональный язык», «Zend»
- «PHP: Hypertext Preprocessor», «функциональный язык», «PHP»
- «Personal Hypertext Processor», «скриптовый язык», «Zend»
- «Personal Hypertext Processor», «скриптовый язык», «PHP»
- «Personal Hypertext Processor», «функциональный язык», «Zend»
- «Personal Hypertext Processor», «функциональный язык», «PHP»
Ответ: «PHP: Hypertext Preprocessor», «скриптовый язык», «Zend»
Обсуждение: PHP происходит от английской фразы PHP: Hypertext Preprocessor. Данный язык относится к семейству скриптовых языков. С 1999 года она работает на движке Zend Engine.
Все эти факты нужно просто запомнить.
Вопрос 2
Вопрос: Что будет выведено на экран в результате выполнения следующего кода?
Варианты ответов:
- echo ‘Какой-то текст’;
- Какой-то текст
- Ничего не выведется
- Возникнет ошибка
Ответ: Какой-то текст
Обсуждение: В данном фрагменте используется синтаксис скриптового тега, который представляет собой обычный html блок. См. следующий вопрос.
Вопрос 3
Вопрос: Какие из перечисленных тегов непригодны для открытия и закрытия PHP блока?
Варианты ответов:
Ответ:
Обсуждение: На самом деле существует несколько разновидностей PHP тегов.
Standard Tags — чаще всего используются стандартные теги. Их невозможно деактивировать:
Short Tags — короткие теги используются реже. Для того чтобы они были активны, в php.ini нужно опции short_open_tag выставить значение On:
Второй вид укороченного тега. Эквивалент кода
Script Tags — скриптовый тег представляет собой обычный html блок:
ASP Tags — теги в стиле ASP.NET. Для активации в php.ini нужно опции asp_tags выставить значение On:
Вопрос 4
Вопрос: Почему в PHP файлах не рекомендуется ставить «?>» закрывающийся тег?
Варианты ответов:
- Для того чтобы предотвратить случайное включение пробелов или переносов на новую строку
- Подобная рекомендация улучшает читабельность
- Это важный аспект безопасности
- Не рекомендуется? Не, это не правда
Ответ: Для того чтобы предотвратить случайное включение пробелов или переносов на новую строку
Обсуждение: итак, если у вас в файле присутствует только PHP код, то действительно настоятельно не рекомендуется ставить “?>” закрывающийся тег.
Дело в том, что после закрывающего тега, вы или ваш текстовой редактор можете случайно поставить несколько пробелов, переноса на новую строку, знаков табуляции и других невидимых символов. В дальнейшем, если вы будете подключать данный файл через include или require, то у вас могут возникнуть ошибки. Одна из них — это “Cannot add header information — headers already sent”. Не встречались с таким сообщением?
Всё дело в том, что лишние скрытые символы после закрывшегося тега могут попасть в ответ HTTP заголовков, что и приведёт к ошибке. Если же тег не закрывать, то скрытые символы не будут выведены.
Так что следуйте рекомендации и не закрывайте теги в файлах, где у вас только PHP код.
Вопрос 5
Вопрос: Что будет выведено в результате выполнения следующего кода?
Варианты ответов:
- 33
- 22
- 11
- 0
- 22 = 11 = 33
- Возникнет «Parse error»
Ответ: 33
Обсуждение: В первую очередь вам необходимо знать, что каждое PHP выражение следует заканчивать символом “;”.
НО в принципе, в последнем выражении, после которого следует закрывающийся тег, точку с запятой ставить не обязательно. PHP на это не будет ругаться, однако во избежание каких-то скрытых проблем, лучше всё-таки все выражения заканчивать точкой с запятой.
Вопрос 6
Вопрос: Что будет выведено в результате выполнения следующего кода?
Варианты ответов:
Ответ: AB D
Обсуждение: В PHP существует несколько видов комментариев: состоящие из одной строки или из множество строк.
Для того чтобы поставить комментарий на одной строке, мы можем воспользоваться следующим синтаксисом:
// комментарий на одну строку (используется чаще) или # комментарий на одну строку
Для того чтобы написать комментарий на несколько строк, его нужно поместить между блоком /* */:
/* Комментарий 1 . */
Если же комментарий стоит на той же строчке, где и закрывающийся PHP тег, то строка кода с какой-то операцией будет закомментирована, а тег — нет. Таким образом, никакой ошибки не возникнет. В PHP блоке выведутся буква AB, а после него пробел и буква D.
Вопрос 7
Вопрос: Что будет выведено в результате выполнения следующего кода?
Варианты ответов:
- apple0banana1orange
- applebananaorange
- apple banana orange
- apple0 banana1 orange
- apple 0 banana 1 orange
- возникнет ошибка
Ответ: возникнет ошибка
Обсуждение: Вопрос с подвохом. 🙂 В результате выполнения данного кода возникнет ошибка, т.к. в PHP нельзя разделять пробелами ключевые слова, названия переменных, фукнций и прочие конструкции. Тут же это правило нарушено, и ключевое слово for each написано через пробел.
Вопрос 8
Вопрос: Что будет выведено в результате выполнения следующего кода?
Варианты ответов:
- Hello Certification.
- Возникнет ошибка
- Hello PHP Certification.
- Hello PHP Certification.
- HelloPHP Certification.
- Hello Certification.
Ответ: Hello Certification.
Обсуждение: Дело в том, что в PHP все блоки рекомендуется заключать между символами “< >”. Если данные символы не используются, то в расчёт берётся только первое выражение, как в нашем примере.
if (false) echo "PHP "; // если false, то выведется только эта строка echo " Certification"; // будет выводится всегда, вне зависимости от работы if
Если же данные две строки поместить в блок:
if (false)
то ситуация изменится. Обе строки будут зависеть от условия if.
Вопрос 9
Вопрос: В чём разница между echo и print?
Варианты ответов:
- print можно использовать как часть выражения, а echo нет
- echo можно использовать как часть выражения, а print нет
- Между этими функциями нет никакой разницы
Ответ: print можно использовать как часть выражения, а echo нет
Обсуждение: Итак, разница между echo и print действительно есть. Дело в том, что функция print в качестве возвращаемого значения всегда даёт единицу, поэтому её можно использовать в части выражения, а echo — нет.
Вопрос 10
Вопрос: Что будет выведено в результате выполнения следующего кода?
else if (print ‘PHP’ == $string) < echo 'A'; >else
Варианты ответов:
Ответ: B
Обсуждение: Не многие знают, что в качестве возвращаемого значения функция print всегда даёт единицу. Это даёт нам возможность заниматься “магией” — использовать print в различных выражениях.
Т.к. выражение “print ‘PHP’” вернёт нам 1, и 1 равна 100-99 = 1, 1 == 1, то выведется буква B. Если хотя бы одно условие if выполнилось, то работа условия прекращается.
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.ruseller.com
Автор: Станислав Протасевич
Урок создан: 8 Августа 2013
Просмотров: 27711
Правила перепечатки
5 последних уроков рубрики «PHP»
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
![]()
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
![]()
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
![]()
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
![]()
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Правда ли что закрывающий тэг для php «?>» не рекомендуется ставить в конце страницы?
Прочитал сейчас статью там было написано что не рекомендуется в конце страницы ставить закрывающий тэг для php. Возможно я неправильно понял или это действительно так?
Лучший ответ
Php — это Печаталка и ВСЁ.
Сервер ВЫВОДИТ из файла .php всё, что заключено между тегами
ЭТО ВСЁ, что делается. Никаким образом невозможно записать хоть что-то в файл .php, в том числе и перед последним тегом, так как вывод обеспечивает СЕРВЕР, то есть в первую очередь надо что-то попытаться записать на сам Сервер, так как ЛЮБОЕ обращение к файлу .php никаким образом не выводит его сам и не может подключить его к записи.
Поэтому мне довольно весело читать, ТАКОЕ.
По поводу того, что есть переход на новую строку в конце файла: Поставьте их сто тысяч, от этого совсем НИЧЕГО не изменится, ИСПОЛНЯЕТСЯ всё то, что находится между тегами
По поводу того, что в Php многое не надо, например объявлять переменные и их свойства, и тот же конец файла .php — по поводу Первых — да, можно ничего не объявлять, но заключительный тег ставить надо обязательно, хотя бы по той причине, чтобы не НАПРЯГАТЬ сервер, когда он всё время будет не находить конец файла и сам станет его завершать по своему усмотрению (лишние ресурсы)
Валера УдавМастер (1494) 12 лет назад
Вот и не поймёшь кто да говорит кто нет. вот линк мне прислали http://framework.zend.com/manual/ru/coding-standard.php-file-formatting.html там тоже говорится что не разрешается писать закрывающий тэг. Ну в принципе я всегда писал закрывающие тэги, проблем никогда не было) Да и код так выглядит более завершённым
Алекс 777 Оракул (81923) Так Вы же смотрите ЗАЧЕМ и КТО ЭТО пишет PHP в Zend Framework’е ШИФРОВАНИЕ — вот, что это такое. ZEND уже давно шифрует .php файлы так, чтобы другие не могли распознать код. Это ТОЛЬКО их фишка, и не имеет к самому PHP ничего. Если Вы станете ШИФРОВАТЬ файлы их МЕТОДОМ, то и должны выдерживать ИХ СТАНДАРТЫ, только и всего. Если же Вы не будете ничего шифровать, а будет использовать обычные файлы php, то ни в коем случае, нельзя убирать последний тег.
Lexx918Мыслитель (5085) 12 лет назад
Печаль. Полное не понимание концепции языка и его первичного назначения.
PHP родился как шаблонизатор. Всё, что находится вне тэгов ПХП будет просто выводится на печать во время интерпретации файла скрипта. И это стало первопричиной появления запрета на закрывающий тэг. Иначе, случайно попавшие после него пробельные символы просто вываливаются в браузер. Т.о. ломается вёрстка в IE, ломается установка заголовков.
Зенд не занимается шифрованием файлов. Область их разработок выходит за эти примитивные рамки.
Шифрованием занимается зенд-гвард. Оптимизацией занимается зенд-оптимайз. До недавнего времени оба продукта входили в один пакет и поставлялись вместе.
http://www.zend.com/en/company/
Учитывая, что зенд — это и есть ПХП (они его основные спонсоры и разработчики ядра языка), я не знаю более вменяемого мануала по кодированию, чем их рекомендации к стилизации кода.
Lexx918 Мыслитель (5085) * линк ушёл на аппурв. http://www.zend. com/en/company/
Остальные ответы
Бред. Если страница состоит целиком из скрипта, то закрывающий тег по любому будет в конце. (ваш КЭП)
Валера УдавМастер (1494) 12 лет назад
Вот и я о том же подумал. Сейчас перечитал этот абзац, всё таки там однозначно говорится о том что нельзя ставить закрывающий тэг. Могу процитировать, сам почитай:
Валера УдавМастер (1494) 12 лет назад
Не нужно лениться. Не нужно пользоваться short-тегами. Их вообще скоро выведут из употребления, так как они пересекаются с XML. Писать нужно только так: нельзя ставить ни в коем случае. Это не просто вредно, но и опасно.
Объясню, чтоб не быть голословным.
1. После него может оказаться пробел или перенос строки. А так, как файл подключен выше доктайпа, значит и пробел вылезет туда. А это гарантированно угробит верстку в IE.
2. Всё, что написано после него, интерпретируется как HTML. А это значит, что (не дай Бог) в конец файла попадет вирус, то он сработает.
А тупые боты именно туда норовят прописать всякую гадость. Так вот, ежели его (закрывающего значка) не будет, то вирь попадет в тело php и вызовет ошибку. Плохо конечно, но лучше, чем бы он сработал у клиента.
SELIGOZAVR Просветленный (42854) насколько я понимаю- вирус-это вредоносная программа.хтмл-язык разметки а не программирования. как разметка может быть программой?бот-это тоже программа!
Валера УдавМастер (1494) 12 лет назад
Не нужно лениться. Не нужно пользоваться short-тегами. Их вообще скоро выведут из употребления, так как они пересекаются с XML. Писать нужно только так: «» нельзя ставить ни в коем случае. Это не просто вредно, но и опасно.
Объясню, чтоб не быть голословным.
1. После него может оказаться пробел или перенос строки. А так, как файл подключен выше доктайпа, значит и пробел вылезет туда. А это гарантированно угробит верстку в IE.
2. Всё, что написано после него, интерпретируется как HTML. А это значит, что (не дай Бог) в конец файла попадет вирус, то он сработает.
А тупые боты именно туда норовят прописать всякую гадость. Так вот, ежели его (закрывающего значка) не будет, то вирь попадет в тело php и вызовет ошибку. Плохо конечно, но лучше, чем бы он сработал у клиента.
Валера УдавМастер (1494) 12 лет назад
Тьфу глупый мэйл всё обрезает. Вот тут вся статья irbis-team .com/15/10/2 (пробел убери)
~ Мудрец (19013) > в конец файла попадет вирус, то он сработает Что-то слабо представляю себе вирус в html. > А так, как файл подключен выше доктайпа, значит и пробел вылезет туда. А это гарантированно угробит верстку в IE. Что мешает использовать код под доктайпом?
SELIGOZAVRПросветленный (42854) 12 лет назад
и вобще как может пробел в конце страницы оказаться над доктипом,который изначально в самом верху страницы?или я чего-то не догоняю сути вопроса про конец?это уже будет чистый баг кодинга именно обожаемого автором зенда. или его самого. даже в этом случае ни что не мешает сперва вставить сперва доктип,а после пхп код..
Lexx918 Мыслитель (5085) Любой серьёзный проект имеет архитектуру MVC http://ru.wikipedia.org/wiki/MVC или некое её подобие. Поэтому вначале выполняется вся логика приложения, а уже потом идёт вывод контента. Если в конце одного из ядерных скриптов (классы, шаблонизатор, конфиги, наборы функций и т.п.) закрыть php и случайно поставить любой пробельный символ, он вывалиться в браузер пользователю раньше всего остального. Это как раз и ломает вёрстку в IE. Да и вообще противоречит самой идее отделения бизнес-логики от логики отображения и стилизации.
Да. Слышал, что если вирус добавит какую-нибудь гадость в конец файла, интерпретатор выдаст ошибку, а не покажет это чудо клиенту.
Дело в том, что некоторые редакторы, например gedit, сохраняют документ так, чтобы в конце обязательно был перевод строки, при этом прячут этот перевод от пользователя как страшную тайну. В таком случае, если у тебя выдача хедеров идет после инклюда каких-либо скриптов, получится варнинг (только если выдача на этой стадии вообще не отключена, как во многих популярных движках) . Выдачу лучше не отключать, поскольку бывает при дебаге несколько строчек, добавленных в код, позволяют то, чего не умеет дебагер.
Источник: лично я тэг ставлю, поскольку считаю, что синтаксис не место для хаков, все должно быть четко
Проблемы недоязыка.
[ссылка заблокирована по решению администрации проекта]
Для файлов, содержащих только PHP-код, закрывающийся тег не разрешен. Он не требуется синтаксисом PHP. Это предотвращает от случайного включения в вывод конечных пробелов.
Это неправда что нерекомендуется ставить вконце файла ?>.
мнения разделились. спецификацию не судьба почитать?
между считается кодом пхп, а все остальное как хтмл код интерпретируется. а в хтмл любое количество пробелов браузер примет за 1 пробел в рендеринге. а перевод строки происходит специальным тегом.
Почему не работает код в . Как включить поддержку сокращённых тегов в PHP. Что означает
Закрывающий тег не является обязательным. Тем не менее, закрывающий тег может использоваться когда заканчивается PHP код и начинается, например, HTML код.
Пары и ?> могут использоваться в одном файле несколько раз, отделяя PHP код от HTML кода.
Важная вещь, которую нужно знать про закрывающий тег ?>: он выбросит вас из PHP в HTML даже если он закомментирован с помощью //. Однако комментарий /* */ справляется — тег ?> теряет своё специальное значение. Помните об этой интересной особенности, поскольку при комментировании блоков кода, вы можете столкнуться с необычной ситуацией, когда ?> продолжит работу не смотря на то, что вы этого не ожидаете.
В некоторых старых скриптах или старых учебниках вы можете встретить примеры PHP кода, помещённого между тегов и ?>.
Если вы поместите какой-то PHP код между этих тегов, то почти наверняка веб-браузер просто ничего не отобразит с новой версией PHP.
Почему не работает код в
В современных версиях PHP поддержка коротких тегов по умолчанию отключена. Причина в появлении формата XML, взгляните на следующую строку: xml version=»1.0″?>
Эта строка содержит теги PHP, хотя на самом деле это элемент XML разметки. Чтобы избежать такой двусмысленности, сокращённые теги отключены, но их поддержку можно снова включить!
Как включить поддержку сокращённых тегов в PHP
В файле php.ini имеется директива:
short_open_tag = Off
она определяет, разрешается ли короткая форма записи ( ) тегов PHP. Если вы хотите использовать PHP совместно с XML, вы можете отключить эту опцию, чтобы беспрепятственно использовать . В противном случае, вы можете отобразить это при помощи PHP, например: ‘; ?>. Если же эта опция отключена, вы должны использовать длинную форму открывающего тега PHP ( ).
Больше не работают и
В PHP 7 удалена поддержка тегов ASP и %>, а также .
Что означает
Пример её использования, не вызывающий синтаксическую ошибку:
Отделение PHP и HTML кода
Все, что находится вне пары открывающегося и закрывающегося тегов, игнорируется интерпретатором PHP, у которого есть возможность обрабатывать файлы со смешанным содержимым. Это позволяет PHP-коду быть встроенным в документы HTML, к примеру, для создания шаблонов.
Это будет проигнорировано PHP и отображено браузером.
Это тоже будет проигнорировано PHP и отображено браузером.
Это работает так, как и ожидается, потому что когда интерпретатор PHP встречает закрывающие теги ?>, он просто начинает выводить все что найдёт (за исключением сразу следующего символа перевода строки) пока не встретит другой открывающий тег за исключением случая с содержащимся внутри кода условным оператором, в котором интерпретатор определяет результат условия перед принятием решения что пропустить. Ознакомьтесь со следующим примером.
Продвинутое изолирование с использованием условий:
Это будет отображено, если выражение истинно. В ином случае будет отображено это.
В этом примере PHP пропускает блоки, где условие не соблюдается. Даже несмотря на то, что они находятся вне пары открывающих/закрывающих тегов, PHP пропустит их в соответствии с условием, так как интерпретатор PHP будет перепрыгивать через блоки, содержащиеся внутри условия, которое не соблюдается.
При выводе больших блоков текста выход из режима синтаксического разбора PHP обычно более эффективен, чем отправка текста с помощью функций echo или print.
Выход из HTML также применяется к другим управляющим операторам:
Hello, there!
При выполнении приведённого выше фрагмента кода, мы получаем следующий вывод:
Hello, there! Hello, there! Hello, there! Hello, there!
Разделение инструкций
Как в C или Perl, PHP требует окончания инструкций точкой запятой в конце каждой инструкции. Закрывающий тег блока PHP-кода автоматически применяет точку с запятой; т.е. нет необходимости ставить точку с запятой в конце последней строки блока с PHP-кодом. Закрывающий тег блока «поглотит» немедленно следующий за ним переход на новую строку, если таковой будет обнаружен.
Замечание: закрывающий тег PHP-блока в конце файла не является обязательным, и в некоторых случаях его опускание довольно полезно, например, при использовании include или require, так, что нежелательные пробелы не останутся в конце файла и вы все еще сможете добавить http-заголовки после подключения к ответу сервера. Это также удобно при использовании буферизации вывода, где также нежелательно иметь пробелы в конце частей ответа, сгенерированного подключаемыми файлами.
Связанные статьи:
- Как увеличить память и время для PHP скриптов (100%)
- Как отключить определённые функции в PHP (100%)
- PHP cURL как установить значение User Agent ИЛИ как сделать так, чтобы сервера не блокировали запросы cURL? (84.5%)
- Как получить User Agent в PHP. Как настроить browscap.ini (71.1%)
- Вышел PHP 8: обзор изменений языка (71.1%)
- Решение проблемы на PHP 7: Parse error: syntax error, unexpected T_NEW (RANDOM — 34.5%)
