Это плохая практика использовать тег <? = В PHP?

190

Я <?= ?>недавно сталкивался с этим тегом PHP и неохотно им пользуюсь, но он так сильно чешется, что я хотел, чтобы вы его взяли. Я знаю , что это плохая практика , чтобы использовать короткие тег , <? ?>и что мы должны использовать полные тег <?php ?>вместо этого, но что об этом один: <?= ?>?

Это сэкономит некоторую печатность и будет лучше для читабельности кода, IMO. Итак, вместо этого:

<input name="someVar" value="<?php echo $someVar; ?>">

Я мог бы написать это так, что чище:

<input name="someVar" value="<?= $someVar ?>">

Не одобряется ли использование этого оператора?

марко-fiset
источник
11
Проблема с этим вопросом заключается в том, что он так самоуверен. Там "технически" нет правильного или неправильного пути. Некоторые утверждают, некоторые против, все его предпочтения. Так что, в конце концов, решать вам.
mseancole
Избегайте закрывающего тега в любой форме, если можете, т.е. файл содержит только php-код (без HTML и т. Д.). Если у вас есть закрывающий тег, любые символы после него будут выводиться в браузер (для веб-приложения), что может привести к очень сложным проблемам при отладке. Для получения дополнительной информации: stackoverflow.com/a/4453835/49560
dharm0us
Не связанные с мнением: остерегайтесь, потому что echoочень легко ведет к XSS, и вам лучше полагаться на метод эхом, зависящий от контекста (т.е. наличие function html($x) { echo htmlentities($x,...); }и использование html($someVar);вместо echo $someVarили использование echo json_encode($x);для контекста JS). Это делает <?=тэги плохой практикой, потому что это означает, что вы экранировали содержимое переменной HTML в другом месте, и поэтому другое место должно волшебным образом знать, что эта переменная должна быть экранирована HTML, потому что она отражается в контексте HTML.
Ксенос

Ответы:

211

история

Прежде чем поезд дезинформации выйдет слишком далеко от станции, нужно кое-что понять о коротких тегах PHP.

Основная проблема с короткими тегами PHP заключается в том, что PHP удалось выбрать тег ( <?), который использовался другим синтаксисом, XML .

При включенной опции вы не смогли получить необработанный вывод объявления xml без получения синтаксических ошибок:

<?xml version="1.0" encoding="UTF-8" ?>

Это большая проблема, если учесть, насколько распространен XML-анализ и управление.

Как насчет <?=?

Хотя <?вызывает конфликты с XML, <?= не делает . К сожалению, варианты его включения и выключения были привязаны short_open_tag, а это означало, что для получения выгоды от использования короткого тега echo ( <?=) вам пришлось столкнуться с проблемами короткого открытого тега ( <?). Проблемы, связанные с коротким открытым тегом, были намного больше, чем преимущества короткого эхо-тега, поэтому вы найдете миллион с половиной рекомендаций по short_open_tagотключению, которые вам следует .

В PHP 5.4, однако, короткий эхо-тег был повторно включен отдельно от short_open_tagопции. Я рассматриваю это как прямое подтверждение удобства <?=, так как в этом нет ничего принципиально неправильного.

Проблема в том, что вы не можете гарантировать, что получите, <?=если попытаетесь написать код, который мог бы работать в более широком диапазоне версий PHP.

Хорошо, теперь, когда все это не в порядке

Вы должны использовать <?=?

блок-схема о том, использовать или нет короткий эхо-тег

zzzzBov
источник
71
Я не согласен с вашей быстрой диаграммой. Правильный ответ - 99,99% ДА, потому что большинство производственных сред настроены на использование коротких тегов. Предположим, что вы все испортили, а они <?=в будущем удалят, вы можете исправить это менее чем за минуту, независимо от того, сколько тысяч файлов его используют, вы просто выполняете поиск и замену <?=для всего проекта <?php echo . Мой ответ - не беспокойтесь, а просто используйте его , преимущества значительно перевешивают последствия. <?=больше не расценивается как короткий ярлык, сам Расмус Лердорф совершил это.
dukeofgaming
32
@dukeofgaming, где вы получаете данные о том, что производственные среды настроены на использование коротких тегов? Отключение их - одна из наиболее часто предлагаемых конфигураций, о которой я слышал, вторая после отключения магических кавычек. Также было бы абсолютно бессмысленно иметь среду разработки, отличную от рабочей.
zzzzBov
4
Короткие теги были включены по умолчанию до версии 5.3 php.net/manual/en/ini.core.php#ini.short-open-tag , большинство известных мне хостинговых сервисов поддерживали его без проблем, и это было одной из причин, по которым инфраструктура Kohana раньше поощрял это. <?=всегда будет включен ( stackoverflow.com/a/6064813/156257 ) и большую часть времени они были включены. Вы можете доказать, что я не прав, проверив у своего хоста, если: они отключены и используют PHP <5.3, и если они не позволяют настройке быть переопределенными пользователями или по специальному запросу; если все предыдущее ложно, непременно переживайте <?=.
dukeofgaming
6
Вы не волнуетесь, что <?=будут удалены, и я тоже. Другие могут быть, и если они, они не должны использовать <?=. Некоторые люди иррационально боятся использовать определенные языковые функции ( например, не использовать закрывающие теги в php ).
zzzzBov
8
В этом и заключается моя точка зрения: не нужно беспокоиться . Я просто поставил "Ты волнуешься?" --yes -> «Иди и используй их, не нужно беспокоиться». Также вы чувствуете, что подразумеваете, что закрытие тегов - плохая практика, а это не так.
dukeofgaming
29

Стереть мою шляпу PHP

Я определенно одобрил бы использование <?= $someVar ?>более многословного echo(просто личное предпочтение). Только недостаток AFAIK для пользователей , которые работают предварительно 5.4.0, в этом случае short_open_tagдолжны быть включены в php.ini .

Сказав это, если ваш проект не ОС, то это спорный вопрос. Если это так, я бы либо задокументировал тот факт, что short_open_tags должен быть включен, либо использовал бы более переносимое из двух решений.

Демиан Брехт
источник
1
Nitpick: Несмотря на то <?=, что short_open_tagна PHP 5.4 это не влияет , <?все еще есть, и если у вас есть привычка использовать короткие теги формы, довольно легко забыть, что поддерживается в какой версии.
Яннис
7
@YannisRizos Хорошо бы отличить <?=«Я сейчас вывожу переменную» для использования в стиле шаблона и <?php«Я сейчас запускаю много кода». Я бы посоветовал никогда не пользоваться <?, но это и так <?=и <?phpнормально.
Изката
2
+1, потому что Расмус Лердорф поддерживает сокращенную метку <? =. Я смотрел один из его выступлений по (тогда скоро будет выпущен) PHP 5.4. Вот почему, начиная с PHP 5.4.0, тег <? = Всегда доступен. До PHP 5.4 я видел много кода, в котором тег <? = Используется в представлении приложения MVC, а <? Php ...?> Используется в файлах без просмотра.
программист
@ Джейсон Это не то, что я говорю. «Расмус одобряет foo» - это не аргумент, «Расмус одобряет foo по этой и той же причине».
Яннис
2
@ Яннис Ризос "Расмус одобряет Фу по этой и той причине", однако, есть. Спасибо за опеку, но я рассуждал так, поскольку Расмус Лердорф одобрил ее, будучи создателем языка и все еще влияющим на развитие PHP, были внесены изменения, чтобы сделать тег <? = Всегда доступным. Это то, что я должен был добавить к своему первоначальному комментарию: «Поэтому практика использования <? = В представлениях, вероятно, станет еще более распространенной». Черт возьми, мне нужно трижды проверить мои комментарии на ... точек ...
программист
21

Вы должны определенно стараться избегать коротких тегов формы, будь то <?или <?=.

Основная техническая причина - мобильность, вы никогда не можете быть уверены, что короткие теги форм будут работать для каждой конкретной настройки, так как они могут быть отключены, посмотрите short_open_tagдирективу. Но вы всегда можете быть абсолютно уверены, что длинная форма будет работать везде.

Это сэкономит некоторую печатность и будет лучше для читабельности кода, IMO.

Это тоже плохая привычка. Я не могу сказать вам, что вы находите более читабельным, но я категорически против использования читабельности кода в качестве предлога, чтобы сэкономить пару нажатий клавиш. Если вы беспокоитесь о читабельности, вам следует использовать шаблонизатор:

<input name="someVar" value="{someVar}">

гораздо более читабельным из обоих ваших примеров.

Наконец, стоит отметить, что короткие теги форм явно не приветствуются крупными проектами PHP, например, PEAR и Zend Framework .

Яннис
источник
14
+1 за шаблоны. -1 для мобильности. Это язык серверной части. Задачи, на которых вы должны сосредоточиться для сервера, такие как масштабируемость и безопасность. Было бы поразительно плохой идеей уделить серьезное время тому, чтобы убедиться, что оно будет работать на нескольких платформах ... (на всякий случай!) ...
riwalk
3
@ Stargazer712 Хм? Единственное, что вам нужно сделать, это использовать стандарт, <?phpа echoне <?и <?=, считаете ли вы это серьезным временем? А что происходит, когда вы перемещаете свой проект на сервер, где по каким-то причинам короткие теги отключены?
Яннис
13
@Yannis: эти несколько персонажей могут показаться не такими уж и много, но IMO они создают много шума.
Кевин Клайн
8
Я думаю, следует упомянуть, что первоначальная цель PHP заключалась в том, чтобы быть языком шаблонов . Добавление еще одного движка шаблонов (больше раздувания) поверх PHP не поможет моей лодке с тунцом. Просто следуйте рекомендациям (здесь есть несколько полезных советов stackoverflow.com/questions/62617/… ) при кодировании PHP, смешанного с HTML, и все готово.
программист
2
@Yannis Rizos Да, это следует упомянуть, потому что новички в PHP могут подумать, что они обязаны использовать шаблонизатор [whizbang] в своих проектах PHP, не рассматривая вместо этого использование чистого PHP. Должен ли я выполнять обработку текста только в Perl , а может и нет, но я полагаю, что к настоящему времени Perl чертовски хорош в обработке текста - также с PHP и шаблонизацией.
программист
15

В PHP-документации четко сказано, что вы можете безопасно использовать короткие эхо-теги:

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

Хотя это для PHP версии 5.4 и выше, но каждый должен по крайней мере использовать это. Я бы предпочел их только для шаблонных целей.

Hexodus
источник
10

Причины использования коротких тегов:

  • Они короче.

Причины не использовать короткие теги:

  • Они вводят еще одну настройку - хотя вы в большинстве случаев управляете сервером в профессиональном контексте, если вы планируете выпустить свой код для широкой публики, короткие теги могут быть неисправимы для людей, которые используют его, например, на виртуальном хостинге. ,
  • Они делают слишком легким случайное попадание необработанных строк в ваш вывод. Это страшно, потому что это может привести к уязвимости XSS. Хотя длинные теги напрямую ничего не делают для предотвращения этого, они дают понять программисту, что, возможно, то, что они делают, не является правильным, и им следует начать использовать систему шаблонов, которая автоматически обрабатывает для них HTML-кодировку прямо сейчас . Вывод динамических строк с длинными тегами является болезненным, что является хорошей (обучающей) вещью.
tdammers
источник
Это ответ на принятие IMO, даже если шаблоны не сделают все XSS безопасным (пользовательские данные в атрибуте src скрипта всегда будут небезопасны), и я не знаю, знает ли механизм шаблонов о правильном отображающемся контексте; что если переменная PHP окажется в содержимом тега скрипта? В SVG встраивается в HTML?
Ксенос
@ Xenos ясно, что зависит от рассматриваемой системы шаблонов, и нет серебряной пули; но большинство из них действительно уменьшают количество ошибок и количество сценариев, где требуется ручное усердие (самый важный источник ошибок безопасности). «Не помещать динамический контент в теги скрипта» легче отслеживать (и проверять), чем «убедиться, что весь динамический контент везде правильно закодирован в HTML».
tdammers
4

Я думаю, что <?=версия является хорошей / приемлемой практикой, при условии, что вы используете ее только для окончательного вывода переменных и избегаете любых вызовов функций или троичной логики, которые не имеют прямого отношения к представлению данных.

Это, конечно, намного лучше, чем <? echo($x); ?>везде.

В долгосрочной перспективе вы можете захотеть взглянуть на движки шаблонов, такие как Smarty .

Darien
источник
3
Smarty когда- то был движком шаблонов, но сейчас это устаревший и раздутый беспорядок, и вы должны держаться подальше.
Яннис
2

Начиная с PHP 7.4, игровое поле немного меняется:

<? ?> официально устарела и будет удалена в PHP 8.0.

PHP RFC: устаревшие теги PHP Short open явно указывают, что <?= ?>это не затронуто. Это будет указывать (по моему мнению, не RFC), что его использование не рекомендуется.

Этьен Брюинс
источник
-3

Честно говоря, я думаю, что повторение результата в зависимости от того, какой метод (старый или новый), является чем-то довольно устаревшим, в то время как MVC отмечает 33 года.

Я бы сказал, что да, это хорошая практика - инкапсулировать данные входящего сервера (php) в XML-документ и обрабатывать их на уровне приложений / клиента, таким образом, сохраняя даже идею использования такого тега.

Sebas
источник
1
На самом деле MVC отмечает 33 года, это было впервые изложено в декабре 1979 года в этой статье .
Яннис
да, я все еще в 2000 году, моя ошибка :-)
Себас
1
Гм ... Шаблонирование ... Шаблоны устарели? Являются ли шаблоны и MVC взаимоисключающими?
Тим Сегин