Чи погана практика використовувати тег <? = У PHP?


189

<?= ?>Нещодавно я натрапив на цей тег PHP, і не хочу його використовувати, але він свербить настільки сильно, що мені захотілося взяти його на себе. Я знаю, що це погана практика використання коротких тегів <? ?>і що ми повинні використовувати <?php ?>замість них повні теги , але як бути з цим <?= ?>:?

Це дозволить заощадити набравши текст, і було б краще для читання коду, IMO. Тож замість цього:

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

Я міг би написати це так, що чистіше:

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

Чи нахмурився цей оператор?


11
Проблема такого роду питань полягає в тому, що він настільки впевнений. Там "технічно" це неправильний чи неправильний шлях. Деякі сперечаються за, деякі проти, всі його переваги. Отже, врешті-решт, це залежить від вас.
mseancole

Якщо ви можете, уникайте тега закриття в будь-якій формі, тобто файл містить лише php-код (без html тощо). Якщо у вас є закриваючий тег, будь-які символи після нього будуть виведені в браузер (для веб-програми) - це може призвести до дуже важких проблем налагодження. Для більш: stackoverflow.com/a/4453835/49560
dharm0us

Не пов'язане з думкою: слідкуйте за тим, що echoдуже легко веде до XSS, і вам слід краще покластися на контекстний метод відлуння (тобто: мати a function html($x) { echo htmlentities($x,...); }і un html($someVar);замість echo $someVarабо використовувати echo json_encode($x);для контексту JS). Це робить <?=теги поганою практикою, оскільки це означає, що ви перемістили вміст змінної змісту в HTML в іншому місці, і так, що інше місце повинно магічно знати, що ця змінна повинна бути відхиленою від HTML, оскільки вона перегукується в контексті HTML.
Ксенос

Відповіді:


209

Історія

Перед тим, як поїзд для дезінформації зайде занадто далеко від станції, є купа речей, які потрібно зрозуміти щодо коротких тегів PHP.

Основна проблема коротких тегів PHP полягає в тому, що PHP вдалося вибрати тег ( <?), який використовувався іншим синтаксисом, XML .

Якщо ввімкнено опцію, ви не змогли невірно вивести декларацію xml без отримання синтаксичних помилок:

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

Це велика проблема, коли ви враховуєте, наскільки загальний аналіз і управління XML.

Про що <?=?

Хоча <?викликає конфлікти з xml, <?= але ні . На жаль, варіанти вмикання та вимикання були прив'язані до цього short_open_tag, що означало, що для отримання переваги короткого тегу ехо ( <?=), вам доведеться розібратися з питаннями короткого відкритого тегу ( <?). Проблем, пов’язаних із коротким відкритим тегом, було набагато більше, ніж переваг від короткого тегу ехо, тому ви знайдете мільйон і півтора рекомендацій щодо його short_open_tagвимкнення, що вам слід .

З PHP 5.4, однак, короткий тег відлуння було знову включено окремо від short_open_tagпараметра. Я розглядаю це як пряме підтвердження зручності <?=, оскільки в цьому немає нічого принципово неправильного.

Проблема полягає в тому, що ви не можете гарантувати, що у вас з'явиться, <?=якщо ви намагаєтесь написати код, який може працювати в більш широкому діапазоні версій PHP.

ок, так що тепер це все не виходить

Чи варто використовувати <?=?

блок-схема про те, використовувати чи не використовувати короткий тег ехо


70
Я не погоджуюся з вашою спритною схемою. Правильна відповідь - це 99,99% ТАК, оскільки більшість виробничих середовищ налаштовані на використання коротких тегів. Припустимо , ви підірвали його , і вони знімають <?=в майбутньому ви можете виправити це менш ніж за хвилину, незалежно від того , скільки тисяч файлів використовувати його, ви просто зробити проект-широкий пошук і заміну в <?=протягом <?php echo . Моя відповідь - не хвилюйтесь, а просто використовуйте , користь перевершує наслідки. <?=Сам Расмус Лердорф вже не вважається короткою міткою.
герцогство, яке відбулося

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 та якщо вони не дозволяють користувачеві або за спеціальним запитом змінювати налаштування; якщо все попереднє помилкове, будь-ласка, турбуйтеся <?=.
герцогство, яке відбулося

6
Ви не переживаєте, що <?=вас видалять, і я не буду. Інші можуть бути, і якщо вони є, їм не доведеться користуватися <?=. Деякі люди ірраціонально бояться використовувати певні мовні функції ( наприклад, залишати закриття тегів у php ).
zzzzBov

8
Це якраз моя думка: турбуватися не потрібно . Я б просто поставив "Ви хвилюєтесь?" - так -> "Вперед і користуйтеся ними, турбуватися не потрібно". Також здається, що ви натякаєте на те, що відключення закриваючих тегів є поганою практикою, а це не так.
герцогство, яке відбулося

28

Пил з моєї шапки PHP

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

Тепер сказав, що якщо ваш проект не ОС, то це суперечка. Якщо це так, я б або задокументував факт, що short_open_tagпотрібно ввімкнути, або використати більш портативний із двох рішень.


1
Nitpick: Незважаючи на те <?=, що short_open_tagPHP 5.4 не впливає , <?все-таки є, і якщо ви звикли користуватися тегами коротких форм, досить просто забути, що підтримується в якій версії.
янніс

7
@YannisRizos Добре розрізняти <?=як "Я виводжу змінну зараз" для використання шаблону в стилі шаблону, і <?phpяк "Я зараз використовую багато коду". Я б запропонував ніколи не користуватися <?, але це <?=і <?phpдобре, і нормально.
Ізката

2
+1, оскільки Расмус Лердорф схвалює стенографію <? = Тег. Я дивився один з його розмов на (тоді незабаром буде звільнений) PHP 5.4. Ось чому, оскільки PHP 5.4.0, тег <? = Завжди доступний. Я бачив багато коду до PHP 5.4, що тег <? = Використовується в Перегляді програми MVC, але <? Php ...?> Використовується у файлах без перегляду.
програміст

@Jason Це не те, що я говорю. "Rasmus схвалює foo" не є аргументом, "Rasmus схвалює foo з цієї та тієї причини", проте є.
янніс

2
@ Yannis Rizos "Расмус схвалює дурня з цієї та тієї причини", проте є. Дякую за опіку, але мої міркування були з тих пір, як Расмус Лердорф схвалює його, будучи творцем мови і все ще впливаючи на розвиток 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 і вище, але всім слід користуватися принаймні. Я вважаю за краще їх лише для шаблонів.


10

Причини використання коротких тегів:

  • Вони коротші.

Причини , по яким НЕ використовуючи короткі теги:

  • Вони запроваджують ще одну конфігурацію - якщо ви керуєте сервером більшу частину часу в професійному контексті, якщо ви плануєте випустити свій код для широкої громадськості, короткі теги можуть непоправно зламатися для людей, які використовують його, скажімо, на спільному хостингу .
  • Вони надто просто дозволяють випадково впустити несаніфіковані рядки у ваш висновок. Це страшно, оскільки це може ввести вразливості XSS. У той час як довгі теги нічого не робити безпосередньо , щоб запобігти цьому, вони сигналізують програмісту , що , може бути , що вони роблять це не правильно, і вони повинні почати використовувати систему шаблонів , яка автоматично обробляє HTML-кодування для них прямо зараз . Виведення динамічних рядків з довгими тегами болісно, ​​що добре (навчально).

Це відповідь, щоб прийняти IMO, навіть ті шаблони не стануть безпечним для всіх XSS (дані користувача в атрибуті src скрипту завжди будуть небезпечними), і я не знаю, чи механізм шаблонів знає належний ехо-контекст; що робити, якщо змінна PHP опиняється у вмісті тегів сценарію? У SVG, вбудований у HTML?
Ксенос

@ Xenos ясно, що залежить від системи, про яку йдеться, і срібної кулі немає; але більшість із них зменшують поверхню помилок, і кількість сценаріїв, де необхідна ручна ретельність (єдине найважливіше джерело помилок безпеки). "Не вводити динамічний вміст у теги скриптів" простіше прослідкувати (і перевірити його), ніж "переконайтесь, що весь динамічний вміст скрізь кодується HTML правильно".
tdammers

4

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

Це, звичайно, набагато краще, ніж <? echo($x); ?>скрізь.

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


3
Smarty був коли -то шаблон двигуна, але зараз це застарілий і роздутою безлад, і ви повинні дійсно триматися подалі.
янніс


-3

Якщо чесно, я вважаю, що повторення результату, залежно від того, який метод є (стара чи нова мода), є чимось досить застарілим, тоді як MVC святкує вже 33 роки.

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


1
Насправді MVC святкує 33 роки, вперше це було зазначено в грудні 1979 року в цій статті .
янніс

так, мені ще 2000 рік, моя помилка :-)
sebas

1
гм ... шаблонування ... шаблонування застаріло? Чи взаємовиключення шаблонів та MVC?
Тім Сегейн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.