È una cattiva pratica usare <? = Tag in PHP?


190

Mi sono imbattuto <?= ?>recentemente in questo tag PHP e sono riluttante a usarlo, ma mi fa così male che volevo che tu lo prendessi. So che è una cattiva pratica usare tag brevi <? ?>e che dovremmo usare tag completi <?php ?>, ma per quanto riguarda questo <?= ?>:?

Salverebbe un po 'di battitura e sarebbe meglio per la leggibilità del codice, IMO. Quindi invece di questo:

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

Potrei scriverlo in questo modo, che è più pulito:

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

L'uso di questo operatore è disapprovato?


11
Il problema con questo tipo di domanda è che è così supponente. Lì "tecnicamente" non è un modo giusto o sbagliato. Alcuni sostengono, altri contro, è tutta una preferenza. Quindi alla fine tocca a te.
mseancole,

Evita il tag di chiusura in qualsiasi forma, se puoi - cioè il file contiene solo codice php (no HTML ecc.). Se si dispone di un tag di chiusura, tutti i caratteri che seguono verranno inviati al browser (per un'app Web), il che può causare problemi di debug molto difficili. Per maggiori: stackoverflow.com/a/4453835/49560
dharm0us

Non relativo all'opinione: attenzione perché echoporta molto facilmente a XSS e dovresti fare meglio affidamento sul metodo di eco dedicato al contesto (cioè: avere un function html($x) { echo htmlentities($x,...); }e un html($someVar);anziché echo $someVaro utilizzare echo json_encode($x);per il contesto JS). Questo quindi rende i <?=tag una cattiva pratica perché significa che hai evitato l'HTML del contenuto della variabile in un altro posto, e quindi che un altro luogo deve magicamente sapere che questa variabile deve essere sfuggita all'HTML perché fa eco nel contesto HTML.
Xenos,

Risposte:


211

Storia

Prima che il treno di disinformazione vada troppo lontano dalla stazione, ci sono un sacco di cose che devi capire sui tag corti PHP.

Il problema principale con i tag brevi di PHP è che PHP è riuscito a scegliere un tag ( <?) che è stato utilizzato da un'altra sintassi, XML .

Con l'opzione abilitata, non è stato possibile eseguire l'output non elaborato della dichiarazione xml senza ottenere errori di sintassi:

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

Questo è un grosso problema se si considera quanto è comune l'analisi e la gestione XML.

Che dire <?=?

Anche se <?causa conflitti con XML, <?= no . Sfortunatamente, le opzioni per attivarlo e disattivarlo erano legate short_open_tag, il che significava che per ottenere il vantaggio del breve tag echo ( <?=), dovevi affrontare i problemi del breve tag aperto ( <?). I problemi associati al tag aperto breve erano molto più grandi dei vantaggi del tag eco breve, quindi troverai un milione e mezzo di consigli da short_open_tagdisattivare, che dovresti .

Con PHP 5.4, tuttavia, il breve tag echo è stato riattivato separatamente short_open_tagdall'opzione. Vedo questo come un'approvazione diretta della convenienza di <?=, poiché non c'è nulla di fondamentalmente sbagliato in sé e per sé.

Il problema è che non puoi garantire che avrai <?=se stai cercando di scrivere codice che potrebbe funzionare in una gamma più ampia di versioni di PHP.

ok, quindi ora che è tutto fuori mano

Dovresti usare <?=?

diagramma di flusso sull'opportunità o meno di utilizzare il tag eco breve


71
Non sono d'accordo con il tuo diagramma scattante. La risposta corretta è il 99,99% SÌ perché la maggior parte degli ambienti di produzione è configurata per utilizzare tag brevi. Supponendo che tu lo abbia fatto esplodere e che rimuoveranno <?=in futuro, puoi ripararlo in meno di un minuto, non importa quante migliaia di file lo utilizzino, devi solo fare una ricerca a livello di progetto e sostituirlo <?=per <?php echo . La mia risposta è non preoccuparti e basta usarla , i benefici superano notevolmente le conseguenze. <?=non è più considerato un tag corto, lo stesso Rasmus Lerdorf si è impegnato molto.
dukeofgaming

32
@dukeofgaming, dove stai ottenendo i tuoi dati sugli ambienti di produzione configurati per utilizzare tag brevi? Disabilitarli è una delle configurazioni più comunemente suggerite di cui ho sentito parlare, seconda solo alla disabilitazione delle citazioni magiche. Inoltre avrebbe assolutamente zero senso avere un ambiente di sviluppo diverso dalla produzione.
zzzzBov

4
I tag brevi erano abilitati per impostazione predefinita fino alla 5.3 php.net/manual/en/ini.core.php#ini.short-open-tag , la maggior parte dei servizi di hosting che conosco lo supportava senza problemi e questo era uno dei motivi per cui il framework Kohana usato per incoraggiarlo. <?=sarà sempre attivo ( stackoverflow.com/a/6064813/156257 ) e la maggior parte delle volte erano attivi. Puoi dimostrare che mi sbaglio verificando con il tuo host se: sono disabilitati e utilizzano PHP <5.3 e se non consentono che le impostazioni vengano ignorate dagli utenti o su richiesta speciale; se tutto il precedente è falso, preoccupati in ogni caso <?=.
dukeofgaming

6
Non ti preoccupare che <?=verrà rimosso, e nemmeno io. Altri potrebbero esserlo, e se lo sono, non dovranno usarli <?=. Alcune persone hanno la paura irrazionale di usare determinate funzionalità linguistiche ( come lasciare tag di chiusura in php ).
zzzzBov

8
Questo è esattamente il mio punto: non è necessario preoccuparsi . Metterei semplicemente "Sei preoccupato?" --yes -> "Vai avanti e usali, non c'è bisogno di preoccuparsi". Sembra anche che tu stia insinuando che lasciare tag di chiusura è una cattiva pratica, che non lo è.
dukeofgaming

29

Spolverando il mio cappello PHP

Preferirei decisamente l'uso di <?= $someVar ?>over the verbose echo(semplicemente preferenze personali). L' unico aspetto negativo di AFAIK è per gli utenti che eseguono pre-5.4.0, nel qual caso short_open_tagdeve essere abilitato in php.ini .

Detto questo, se il tuo progetto non è OS, allora è un punto controverso. In tal caso, documenterei il fatto che short_open_tagè necessario abilitare s, oppure utilizzare la più portatile delle due soluzioni.


1
Nitpick: Anche se <?=non è interessato da short_open_tagPHP 5.4, <?lo è ancora e se hai l'abitudine di usare tag in forma breve, è abbastanza facile dimenticare cosa è supportato su quale versione.
yannis,

7
@YannisRizos È bene distinguere <?=come "Sto emettendo una variabile ora" per l'utilizzo in stile modello e <?phpcome "Sto eseguendo un sacco di codice ora". Suggerirei di non usare mai <?, ma entrambi <?=e <?phpvanno bene.
Izkata,

2
+1 perché Rasmus Lerdorf approva il tag di abbreviazione <? =. Ho visto uno dei suoi discorsi sul PHP 5.4 (che presto uscirà). Ecco perché da PHP 5.4.0 il tag <? = È sempre disponibile. Ho visto molto codice pre PHP 5.4 che il tag <? = È usato nella vista di un'applicazione MVC ma <? Php ...?> È usato nei file non-view.
programmatore

@Jason Non è quello che sto dicendo. "Rasmus sostiene il foo" non è un argomento, "Rasmus sostiene il foo per questo e quel motivo" comunque lo è.
yannis,

2
@Yannis Rizos "I Rasmus sostengono il foo per questo e quel motivo" comunque lo è. Grazie per il tutoraggio, ma il mio ragionamento è stato dal momento che Rasmus Lerdorf lo sostiene, essendo il creatore della lingua e avendo ancora influenza sullo sviluppo di PHP, sono state apportate modifiche per rendere il tag <? = Sempre disponibile. Questo è ciò che avrei dovuto aggiungere al mio commento originale "Pertanto la pratica di usare <? = Nelle viste probabilmente diventerà ancora più diffusa." Dang, dovrò controllare tre volte i miei commenti per ora su ... punti ...
programmatore

21

Dovresti assolutamente provare a evitare i tag in formato corto, sia esso <?o <?=.

Il motivo tecnico principale è la portabilità, non si può mai essere sicuri che i tag short form funzioneranno per ogni configurazione, poiché possono essere disattivati, consultare la short_open_tagdirettiva. Ma puoi sempre essere assolutamente certo che la forma lunga funzionerà ovunque.

Salverebbe un po 'di battitura e sarebbe meglio per la leggibilità del codice, IMO.

Anche questa è una cattiva abitudine. Non posso davvero dirti cosa trovi più leggibile, ma sono febbrilmente contrario all'uso della leggibilità del codice come scusa per salvarti un paio di battiture. Se sei preoccupato per la leggibilità, dovresti scegliere un motore modello, questo:

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

è molto più leggibile da entrambi i tuoi esempi.

Infine, vale la pena notare che i tag short form sono esplicitamente scoraggiati dai principali progetti PHP, ad esempio PEAR e Zend Framework .


14
+1 per i modelli. -1 per portabilità. È una lingua lato server. Le sfide su cui devi concentrarti per un server sono aspetti come la scalabilità e la sicurezza. Sarebbe una pessima idea di investire molto tempo per assicurarsi che funzionasse su più piattaforme ... (per ogni evenienza!) ...
riwalk

3
@ Stargazer712 Hm? L'unica cosa che devi fare è usare lo standard <?phpe echoinvece di <?e <?=, lo consideri un momento serio? E cosa succede quando si sposta il progetto su un server in cui per qualche ragione i tag brevi sono disabilitati?
yannis,

13
@Yannis: quei pochi personaggi potrebbero non sembrare molto, ma IMO aggiungono molto rumore.
Kevin Cline,

8
Penso che dovrebbe essere menzionato che lo scopo originale di PHP era quello di essere un linguaggio modello . L'aggiunta di un altro motore modello (più gonfio) in cima a PHP non fa galleggiare la mia barca tonno. Basta seguire le buone pratiche (alcuni buoni consigli sono qui stackoverflow.com/questions/62617/… ) quando si codifica PHP mescolato con HTML e il gioco è fatto.
programmatore

2
@Yannis Rizos Sì, va detto perché le persone che non conoscono PHP potrebbero pensare di essere obbligate a utilizzare il motore di template [whizbang] nei loro progetti PHP senza considerare invece l'utilizzo di PHP puro. Dovrei fare solo l'elaborazione del testo in Perl , forse no, ma immagino che ormai Perl sia dannatamente bravo nell'elaborazione del testo, allo stesso modo con PHP e il templating.
programmatore

15

La documentazione PHP afferma chiaramente che è possibile utilizzare in modo sicuro tag di eco brevi:

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

Anche se questo è per PHP versione 5.4 e successive, ma tutti dovrebbero almeno usarlo. Li preferirei solo a scopo di modello.


10

Motivi per l'utilizzo di tag brevi:

  • Sono più brevi.

Motivi per non utilizzare i tag brevi:

  • Introducono un altro gotcha di configurazione: mentre controlli il server la maggior parte delle volte in un contesto professionale, se prevedi di rilasciare il tuo codice al pubblico, i tag brevi potrebbero non essere riparabili per le persone che lo usano su, diciamo, hosting condiviso .
  • Rendono troppo facile rilasciare casualmente stringhe non igienizzate nell'output. Questo è spaventoso perché potrebbe introdurre vulnerabilità XSS. Mentre i tag lunghi non fanno nulla direttamente per impedirlo, segnalano al programmatore che forse quello che stanno facendo non è la cosa giusta e dovrebbero iniziare a utilizzare un sistema di template che gestisce automaticamente la codifica HTML per loro in questo momento . Emettere stringhe dinamiche con tag lunghi è doloroso, il che è una buona cosa (educativa).

Questa è la risposta per accettare l'IMO, anche se i template non renderanno sicuro tutto l'XSS (i dati dell'utente nell'attributo src di uno script saranno sempre non sicuri) e non so se il meccanismo del template sia a conoscenza del giusto contesto di eco; cosa succede se la variabile PHP finisce nel contenuto di un tag script? In un file SVG incorporato nell'HTML?
Xenos

@Xenos chiaramente dipende dal sistema di template in questione e non esiste un proiettile d'argento; ma la maggior parte di essi riduce la superficie dei bug e il numero di scenari in cui è richiesta la diligenza manuale (la singola fonte più importante di bug di sicurezza). "Non inserire contenuti dinamici nei tag di script" è più facile da seguire (e controllare per) rispetto a "assicurarsi che tutto il contenuto dinamico sia codificato HTML in modo corretto ovunque".
martedì

4

Penso che la <?=versione sia una pratica buona / accettabile, a condizione che la usi solo per l'output finale di variabili ed eviti qualsiasi chiamata di funzione o logica ternaria che non sia direttamente correlata alla presentazione dei dati.

È sicuramente molto meglio che <? echo($x); ?>ovunque.

A lungo termine, potresti voler esaminare motori di template come Smarty .


3
Smarty era una volta il motore del modello, ma in questo momento è un pasticcio obsoleto e gonfio, e dovresti davvero evitare.
yannis,


-3

Ad essere sincero, penso che riecheggiare un risultato qualunque sia il metodo (vecchia o nuova moda) è qualcosa di piuttosto obsoleto mentre MVC celebra già 33 anni.

Direi di sì, questa è una buona pratica per incapsulare i dati del server in arrivo (php) all'interno di un documento XML ed elaborarli nel tuo livello applicativo / client, risparmiando così persino l'idea di utilizzare un tale tag.


1
In realtà MVC celebra 33 anni, è stato delineato per la prima volta nel dicembre 1979 in questo documento .
yannis,

si, sono ancora nel 2000, il mio errore :-)
sebas

1
um ... Templating ... il templating è obsoleto? Templating e MVC si escludono a vicenda?
Tim Seguine,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.