Czy używanie PHP <? = Jest złą praktyką?

189

<?= ?>Ostatnio natknąłem się na ten tag PHP i niechętnie go używam, ale swędzi tak mocno, że chciałem, żebyś się z nim zgodził. Wiem, że jest złą praktyką do wykorzystywania krótkich znaczników <? ?>i że powinniśmy używać pełnych tagów <?php ?>zamiast, ale co z tego: <?= ?>?

Oszczędziłoby to trochę pisania i byłoby lepiej dla czytelności kodu, IMO. Zamiast tego:

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

Mógłbym napisać to w ten sposób, co jest czystsze:

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

Czy używanie tego operatora jest niezadowolone?

marco-fiset
źródło
11
Problem z tego rodzaju pytaniami polega na tym, że jest on tak uparty. „Technicznie” nie jest dobrym ani złym sposobem. Niektórzy opowiadają się za, niektórzy przeciw, za wszystkimi jego preferencjami. Tak więc ostatecznie to zależy od ciebie.
mseancole
Unikaj tagu zamykającego w dowolnej formie, jeśli możesz - tzn. Plik zawiera tylko kod php (bez html itp.). Jeśli masz znacznik zamykający, wszelkie znaki po nim będą wysyłane do przeglądarki (w przypadku aplikacji internetowej) - co może powodować problemy z debugowaniem. Więcej informacji: stackoverflow.com/a/4453835/49560
dharm0us
Nie związane z opiniami: Uważaj, ponieważ echobardzo łatwo prowadzi do XSS i powinieneś lepiej polegać na kontekstowej metodzie echa (tj. Posiadaniu a function html($x) { echo htmlentities($x,...); }i un html($someVar);zamiast echo $someVarlub używaniu echo json_encode($x);w kontekście JS). To sprawia, że <?=tagi są złą praktyką, ponieważ oznacza to, że zmieniono kod HTML zawartości zmiennej w innym miejscu, i że w innym miejscu musi magicznie wiedzieć, że ta zmienna musi być zmienna HTML, ponieważ jest wyświetlana w kontekście HTML.
Xenos

Odpowiedzi:

209

Historia

Zanim pociąg dezinformacji odejdzie zbyt daleko od stacji, jest kilka rzeczy, które musisz zrozumieć na temat krótkich tagów PHP.

Podstawowym problemem związanym z krótkimi znacznikami PHP jest to, że PHP zdążyło wybrać tag ( <?), który był używany przez inną składnię, XML .

Po włączeniu tej opcji nie można było wyodrębnić deklaracji XML bez wyświetlania błędów składniowych:

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

Jest to duży problem, gdy zastanawiasz się, jak popularne jest analizowanie plików XML i zarządzanie nimi.

Co <?=?

Chociaż <?powoduje konflikty z XML, <?= nie powoduje . Niestety, opcje włączania i wyłączania były powiązane short_open_tag, co oznaczało, że aby skorzystać z krótkiego tagu echa ( <?=), trzeba było poradzić sobie z problemami krótkiego tagu otwartego ( <?). Problemy związane z krótkim otwartym tagiem były znacznie większe niż korzyści płynące z krótkiego tagu echa, więc znajdziesz półtora miliona rekomendacji do short_open_tagwyłączenia, które powinieneś .

Jednak w PHP 5.4 krótki znacznik echa został ponownie włączony niezależnie od short_open_tagopcji. Widzę to jako bezpośrednie poparcie dla wygody <?=, ponieważ nie ma w tym nic zasadniczo złego.

Problem polega na tym, że nie możesz zagwarantować, że będziesz mieć, <?=jeśli spróbujesz napisać kod, który mógłby działać w szerszej gamie wersji PHP.

ok, więc teraz to już wszystko

Powinieneś użyć <?=?

schemat blokowy dotyczący tego, czy użyć krótkiego znacznika echa

zzzzBov
źródło
70
Nie zgadzam się z twoim zgryźliwym diagramem. Prawidłowa odpowiedź to 99,99% TAK, ponieważ większość środowisk produkcyjnych jest skonfigurowana do używania krótkich znaczników. Załóżmy, że wysadziłeś go w powietrze i usuniesz <?=w przyszłości, możesz to naprawić w mniej niż minutę, bez względu na to, ile tysięcy plików z niego korzysta, po prostu przeszukujesz i zamieniasz <?=dla całego projektu <?php echo . Moja odpowiedź brzmi : nie martw się i po prostu ją wykorzystaj , korzyści przeważają nad konsekwencjami. <?=nie jest już uważany za krótki tag, sam Rasmus Lerdorf bardzo się zaangażował.
dukeofgaming
32
@dukeofgaming, skąd czerpiesz dane o konfigurowaniu środowisk produkcyjnych do używania krótkich tagów? Wyłączenie ich jest jedną z najczęściej sugerowanych konfiguracji, o których słyszałem, ustępującą jedynie wyłączeniu magicznych cytatów. Byłoby również absolutnie zero sensu mieć środowisko programistyczne inne niż produkcja.
zzzzBov
4
Krótkie tagi były domyślnie włączone do 5.3 php.net/manual/en/ini.core.php#ini.short-open-tag , większość usług hostingowych, które znam, wspierały je bez problemów i był to jeden z powodów, dla których framework Kohana używane, aby to zachęcić. <?=będą zawsze włączone ( stackoverflow.com/a/6064813/156257 ) i przez większość czasu były włączone. Możesz udowodnić, że się mylę, sprawdzając z hostem, czy: są wyłączone i używają PHP <5.3 oraz czy nie pozwalają na zastąpienie ustawienia przez użytkowników lub na specjalne życzenie; jeśli wszystkie poprzednie są fałszywe, to na pewno się martwcie <?=.
dukeofgaming
6
Nie martw się, że <?=zostaną usunięte, ja też nie. Inni mogą być, a jeśli tak, to nie muszą z nich korzystać <?=. Niektóre osoby mają irracjonalny lęk przed użyciem niektórych funkcji językowych ( takich jak pominięcie zamykania tagów w php ).
zzzzBov
8
Właśnie o to mi chodzi: nie trzeba się martwić . Powiedziałbym tylko: „Martwisz się?” - tak -> „Śmiało, używaj ich, nie musisz się martwić”. Wydaje się również, że sugerujesz, że pominięcie zamykania tagów jest złą praktyką, co nie jest prawdą.
dukeofgaming
28

Odkurzę mój kapelusz PHP

Zdecydowanie wolałbym używać <?= $someVar ?>bardziej gadatliwych echo(po prostu osobistych preferencji). Tylko minusem AFAIK jest dla użytkowników, którzy są uruchomione pre-5.4.0, w którym to przypadku short_open_tagmusi być włączony w pliku php.ini .

Powiedziawszy to, jeśli twój projekt nie jest systemem operacyjnym, jest to kwestia sporna. Jeśli tak, udokumentuję fakt, że short_open_tags musi być włączony, lub użyję bardziej przenośnego z tych dwóch rozwiązań.

Demian Brecht
źródło
1
Nitpick: Mimo że w PHP 5.4 <?=nie ma na to wpływu short_open_tag, <?nadal tak jest, a jeśli masz zwyczaj używania krótkich znaczników, łatwo jest zapomnieć o tym, co jest obsługiwane w jakiej wersji.
yannis
7
@YannisRizos Dobrze jest rozróżnić <?=jako „Teraz wypisuję zmienną” do użycia w stylu szablonu i <?phpjako „Teraz uruchamiam dużo kodu”. Sugeruję, aby nigdy nie używać <?, ale zarówno <?=i <?phpsą w porządku.
Izkata
2
+1, ponieważ Rasmus Lerdorf zatwierdza skrót <? = Tag. Obejrzałem jedną z jego wypowiedzi na temat (wtedy niedługo wydanego) PHP 5.4. Dlatego od PHP 5.4.0 tag <? = Jest zawsze dostępny. Widziałem dużo kodu przed PHP 5.4, że znacznik <? = Jest używany w widoku aplikacji MVC, ale <? Php ...?> Jest używany w plikach nieobsługujących widoku.
programista
@Jason Nie to mówię. „Rasmus popiera foo” nie jest argumentem, „Rasmus popiera foo z tego i tego powodu” jednak jest.
yannis
2
@Yannis Rizos „Rasmus popiera foo z tego i tego powodu”. Dzięki za tutelage, ale moje rozumowanie było, odkąd Rasmus Lerdorf go popiera, będąc twórcą języka i wciąż mającym wpływ na rozwój PHP, wprowadzono zmiany, aby tag <? = Zawsze był dostępny. To powinienem był dodać do mojego oryginalnego komentarza „Dlatego praktyka używania <? = W widokach prawdopodobnie stanie się jeszcze bardziej rozpowszechniona”. Cholera, muszę teraz potroić sprawdzenie moich komentarzy na temat ... kropek ...
programista
21

Należy zdecydowanie unikać krótkich tagów formularza, czy to <?lub <?=.

Głównym powodem technicznym jest przenośność, nigdy nie możesz być pewien, że tagi skrócone będą działać dla każdej konfiguracji, ponieważ można je wyłączyć, poszukaj short_open_tagdyrektywy. Ale zawsze możesz być absolutnie pewien, że długa forma będzie działać wszędzie.

Oszczędziłoby to trochę pisania i byłoby lepiej dla czytelności kodu, IMO.

To także zły nawyk. Naprawdę nie mogę ci powiedzieć, co uważasz za bardziej czytelne, ale jestem gorliwie przeciwny używaniu czytelności kodu jako wymówki, aby zaoszczędzić sobie kilku naciśnięć klawiszy. Jeśli obawiasz się o czytelność, powinieneś wybrać silnik szablonów, to:

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

jest znacznie bardziej czytelny z obu twoich przykładów.

Na koniec warto zauważyć, że tagi krótkich formularzy są wyraźnie odradzane przez duże projekty PHP, na przykład PEAR i Zend Framework .

Yannis
źródło
14
+1 dla szablonów. -1 dla przenośności. Jest to język po stronie serwera. Wyzwania, na których należy skupić się na serwerze, to między innymi skalowalność i bezpieczeństwo. Byłoby niezwykle zły pomysł, aby zainwestować poważne czasu na upewnienie się, że to działa na wielu platformach ... (na wszelki wypadek!) ...
riwalk
3
@ Stargazer712 Hm? Jedyną rzeczą, którą musisz zrobić, to użyć standardowego <?phpi echozamiast <?i <?=, że nie można liczyć jako poważny czas? A co się stanie, gdy przeniesiesz projekt na serwer, na którym z jakiegoś powodu krótkie tagi są wyłączone?
yannis
13
@Yannis: te kilka znaków może nie wydawać się wiele, ale IMO dodają dużo hałasu.
kevin cline
8
Myślę, że należy wspomnieć, że pierwotnym celem PHP był język szablonów . Dodanie kolejnego silnika szablonów (więcej wzdęć) na PHP nie unosi mojej łódki tuńczyka. Po prostu postępuj zgodnie z dobrymi praktykami (kilka dobrych wskazówek znajduje się tutaj stackoverflow.com/questions/62617/... ) podczas kodowania PHP mieszanego z HTML i możesz zacząć.
programista
2
@Yannis Rizos Tak, należy o tym wspomnieć, ponieważ ludzie, którzy nie znają PHP, mogą myśleć, że są zobowiązani do korzystania z silnika szablonów [whizbang] w swoich projektach PHP bez rozważania używania czystego PHP. Powinienem tylko przetwarzać tekst w Perlu , a może nie, ale uważam, że do tej pory Perl jest naprawdę dobry w przetwarzaniu tekstu - podobnie w PHP i szablonach.
programista
15

Dokumentacja PHP wyraźnie mówi, że możesz bezpiecznie używać krótkich znaczników echa:

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

Chociaż dotyczy to wersji PHP 5.4 i nowszych, ale każdy powinien przynajmniej z niej skorzystać. Wolałbym je tylko do celów szablonowych.

Hexodus
źródło
10

Powody używania krótkich tagów:

  • Są krótsi.

Powody nieużywania krótkich tagów:

  • Wprowadzają one jeszcze jedną gotową konfigurację - podczas gdy Ty kontrolujesz serwer przez większość czasu w kontekście profesjonalnym, jeśli planujesz opublikować swój kod dla ogółu społeczeństwa, krótkie tagi mogą ulec uszkodzeniu w sposób nieodwracalny dla osób, które go używają, powiedzmy, na dzielonym hostingu .
  • Ułatwiają swobodne upuszczanie niezanieczyszczonych łańcuchów na wyjście. Jest to przerażające, ponieważ może wprowadzać luki w zabezpieczeniach XSS. Podczas gdy długie tagi nie robią nic bezpośrednio, aby temu zapobiec, sygnalizują programistom, że być może to, co robią, nie jest właściwą rzeczą i powinni zacząć korzystać z systemu szablonów, który automatycznie obsługuje teraz kodowanie HTML . Wyprowadzanie ciągów dynamicznych za pomocą długich znaczników jest bolesne, co jest dobrą (edukacyjną) rzeczą.
tdammers
źródło
To odpowiedź na zaakceptowanie IMO, nawet jeśli szablony nie sprawią, że wszystko XSS będzie bezpieczne (dane użytkownika w atrybucie src skryptu zawsze będą niebezpieczne) i nie wiem, czy mechanizm szablonów jest świadomy właściwego kontekstu echa; co jeśli zmienna PHP kończy się zawartością znacznika skryptu? W pliku SVG osadzonym w kodzie HTML?
Xenos
@Xenos wyraźnie to zależy od systemu szablonów, o których mowa, i nie ma srebrnej kuli; ale większość z nich zmniejsza powierzchnię błędu i liczbę scenariuszy, w których wymagana jest ręczna staranność (najważniejsze źródło błędów bezpieczeństwa). „Nie umieszczaj treści dynamicznych w tagach skryptowych” jest łatwiejsze do śledzenia (i kontroli) niż „upewnij się, że wszystkie treści dynamiczne są wszędzie poprawnie zakodowane w HTML”.
tdammers
4

Myślę, że <?=wersja jest dobrą / akceptowalną praktyką, pod warunkiem, że używasz jej tylko do ostatecznego generowania zmiennych i unikasz wywołań funkcji lub logiki trójskładnikowej, które nie są bezpośrednio związane z prezentacją danych.

Z pewnością jest znacznie lepszy niż <? echo($x); ?>wszędzie.

W dłuższej perspektywie warto przyjrzeć się silnikom szablonów, takim jak Smarty .

Darien
źródło
3
Smarty niegdyś silnik szablon, ale teraz to jest przestarzałe i nadęty bałagan, i naprawdę należy omijać.
yannis
2

Począwszy od PHP 7.4, pole gry nieco się zmienia:

<? ?> jest oficjalnie przestarzałe i zostanie usunięty w PHP 8.0.

PHP RFC: Przestarzałe PHP Krótkie otwarte tagi wyraźnie stwierdzają, że <?= ?>nie ma to wpływu. Oznaczałoby to (według mnie, nie RFC), że jego użycie nie jest odradzane.

Etienne Bruines
źródło
-3

Szczerze mówiąc, myślę, że powtórzenie wyniku, bez względu na metodę (stara lub nowa moda), jest czymś dość przestarzałym, podczas gdy MVC świętuje już 33 lata.

Powiedziałbym, że tak, jest to dobra praktyka, aby kapsułkować przychodzące dane serwera (php) w ​​dokumencie XML i przetwarzać je w warstwie aplikacyjnej / klienckiej, oszczędzając Ci nawet pomysłu użycia takiego znacznika.

sebas
źródło
1
W rzeczywistości MVC świętuje 33 lata, po raz pierwszy zostało przedstawione w grudniu 1979 r. W tym artykule .
yannis
tak, wciąż jestem w 2000 roku, mój błąd :-)
sebas
1
um ... Szablony ... czy szablony są przestarzałe? Czy szablony i MVC wzajemnie się wykluczają?
Tim Seguine,