Domanda

Ho appena aggiornato a PHP 5.3 e ho iniziato a supportare un vecchio sito Web per un nuovo cliente. Sembra usare un codice PHP piuttosto strano che non ho incontrato prima.

Durante il tentativo di accedere alle variabili $ _get o $ _Request, lo sviluppatore ha usato quanto segue: $ {"variabile_name"}

Ricevo avvisi generati a causa di variabili non definite (presumibilmente perché PHP non si sta analizzando il $ {"variabile_name"} Codice di stile).

Cambiando questo in $ _Request ['variabile_name' Funziona come previsto, ma non posso passare attraverso tutto il loro codice e modificarlo poiché il sito è enorme e utilizza metodi di layout di proprietà.

Qualcuno sa se è possibile attivare il supporto per questi tag / boschi di codice? Ho dato un'occhiata a Php.ini e c'è una menzione di tag in stile ASP e tag brevi, ma consentire a questi non ha alcun effetto (sembrano completamente diversi, ho pensato che valesse la pena).

È stato utile?

Soluzione

Non credo che ci sia qualcosa di nuovo con quella sintassi:

$a = 10;
var_dump(${"a"});

Funziona bene ;-)


Il tuo problema è probabilmente dovuto al fatto che, prima, register_globals era abilitato (per impostazione predefinita, se PHP <= 4.Something), ed è ora disabilitato - e questo è positivo per la sicurezza!

Con register_globals impostato su ON, qualsiasi variabile in $_REQUEST viene automaticamente iniettato come vargibile nella tua applicazione - Beh, in realtà, questo dipende da variables_order Opzione di configurazione, ma questa include quasi sempre Get, Post e Cookie, almeno.

Ad esempio, se esiste una variabile come $_GET['my_var'], avrai anche un $my_var variabile ... e questo è anche accessibile con la sintassi ${'my_var'}


Considerando register_globals è Off Per impostazione predefinita da qualcosa come PHP 4.2 e dovrebbe scomparire in PHP 6 (se ricordo bene), Consiglierei di riattivarlo ... almeno, se hai il tempo necessario per correggere / testare il codice ...

Altri suggerimenti

La sintassi del tutore riccio per le variabili è una parte incorporata di PHP ed è in circolazione da un po '. Il motivo per cui esiste è risolvere le ambiguità con array e sintassi degli oggetti quando si utilizzano variabili variabili.

Dal manuale:

Per utilizzare variabili variabili con array, è necessario risolvere un problema di ambiguità. Cioè, se scrivi $$ a1 Quindi il parser deve sapere se intendevi usare $ a1 come variabile, o se volevi $$ a come variabile e quindi il 1 indice da quella variabile. La sintassi per la risoluzione di questa ambiguità è: $ {$ a1} per il primo caso e $ {$ a}1 per il secondo.

È una sintassi molto utile in diverse situazioni, come l'uso di variabili di array o oggetto durante l'output di qualcosa usando Sintassi di hedoc.

Non ribaderò il consiglio da parte di altri sull'uso register_globals, Volevo solo esprimere questa sintassi insolita.

La sintassi di $ {"variabile_name"} è praticamente la stessa di $ variabile_name, tranne per il fatto che il contenuto delle parentesi cure viene valutato per primo. È supportato da tutte le versioni recenti di PHP, anche dalle versioni beta. Ciò che non è supportato dalle versioni recenti di PHP è il supporto della registrazione di variabili $ _request (e altre) come variabili globali. C'è un'impostazione per abilitarlo:

register_globals = on

Tuttavia, non è consigliato per l'uso della produzione a causa di problemi di sicurezza. Potrebbe essere più facile eseguire la tua fonte tramite uno strumento "sed" e sostituire gli usi con espressione regolare.

Il vecchio server probabilmente ha REGISTER_GLOBALS Su. Quindi le strane parentesi non sono il problema.

REGISTER_GLOBALS mette tutte le variabili $_REQUEST Come variabili regolari nell'ambito globale, il che significa che puoi accedere $_REQUEST['test'] è possibile accedervi come $test o ${"test"}

La sintassi della staffa è attiva per impostazione predefinita e non credo che tu possa attivarla/spegnere.

register_globals era probabilmente acceso. {$variable_name} La sintassi è sempre attiva, ma register_globals gira cose come $_REQUEST['variable_name'] in $variable_name.

Evita di accenderlo se possibile, tuttavia, c'è una ragione per cui è stato consigliato da tempo, e sta andando via interamente in PHP6.

register_globals è deprecato a partire da PHP 5.3 e verrà rimosso a partire da PHP 6.0. Quello che vuoi fare è utilizzare la funzione di refactoring trovata nella maggior parte dei PHP IDE (Zendo Studio 6+) per rinominare la variabile a qualcosa di più appropriato, IE $_GET['variable_name'].

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top