Qual è il significato di { }
(parentesi graffe) in letterali stringa in PHP?
Qual è il significato di { }
(parentesi graffe) in letterali stringa in PHP?
Risposte:
Questa è la sintassi complessa (riccia) per l'interpolazione di stringhe. Dal manuale:
Sintassi complessa (riccia)
Questo non è chiamato complesso perché la sintassi è complessa, ma perché consente l'uso di espressioni complesse.
Qualsiasi variabile scalare, elemento dell'array o proprietà dell'oggetto con una rappresentazione di stringa può essere inclusa tramite questa sintassi. Basta scrivere l'espressione nello stesso modo in cui apparirebbe al di fuori della stringa, quindi avvolgerla in
{
e}
. Dal momento che{
non può essere evitato, questa sintassi verrà riconosciuta solo quando$
segue immediatamente{
. Usa{\$
per ottenere un valore letterale{$
. Alcuni esempi per chiarire:<?php // Show all errors error_reporting(E_ALL); $great = 'fantastic'; // Won't work, outputs: This is { fantastic} echo "This is { $great}"; // Works, outputs: This is fantastic echo "This is {$great}"; echo "This is ${great}"; // Works echo "This square is {$square->width}00 centimeters broad."; // Works, quoted keys only work using the curly brace syntax echo "This works: {$arr['key']}"; // Works echo "This works: {$arr[4][3]}"; // This is wrong for the same reason as $foo[bar] is wrong outside a string. // In other words, it will still work, but only because PHP first looks for a // constant named foo; an error of level E_NOTICE (undefined constant) will be // thrown. echo "This is wrong: {$arr[foo][3]}"; // Works. When using multi-dimensional arrays, always use braces around arrays // when inside of strings echo "This works: {$arr['foo'][3]}"; // Works. echo "This works: " . $arr['foo'][3]; echo "This works too: {$obj->values[3]->name}"; echo "This is the value of the var named $name: {${$name}}"; echo "This is the value of the var named by the return value of getName(): {${getName()}}"; echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}"; // Won't work, outputs: This is the return value of getName(): {getName()} echo "This is the return value of getName(): {getName()}"; ?>
Spesso questa sintassi non è necessaria. Ad esempio, questo:
$a = 'abcd';
$out = "$a $a"; // "abcd abcd";
si comporta esattamente come questo:
$out = "{$a} {$a}"; // same
Quindi le parentesi graffe non sono necessarie. Ma questo :
$out = "$aefgh";
, a seconda del livello di errore, non funzionerà o produrrà un errore perché non esiste una variabile denominata $aefgh
, quindi è necessario eseguire:
$out = "${a}efgh"; // or
$out = "{$a}efgh";
$vars='x:3,y:9'; $json="{{$vars}}";
. Grazie all'articolo di QiGuang .
$out = '$aefgh'
; (se hai bisogno letteralmente di $ aefgh)
SimpleXMLElement
: {}
viene utilizzato per accedere al nodo stesso, ad es $element[0]->{0}
. Poiché la proprietà "0" non può esistere, questo attiverà __get
/ __set
method. Questo in sostanza ti offre un'alternativa ArrayAccess
all'accesso all'indice, ad esempio 3v4l.org/1F254 .
$min=1;$max=5; echo ".{{$min},{$max}}"
rese .{1,5}
(ho avuto problemi a sapere dove "raddoppiare [le parentesi graffe]" menzionato nel commento di @ BobStein)
Per quanto mi riguarda, le parentesi graffe servono come sostituzione per la concatenazione, sono più veloci da digitare e il codice sembra più pulito. Ricorda di usare le virgolette doppie ("") poiché il loro contenuto è analizzato da PHP, perché nelle virgolette singole ('') otterrai il nome letterale della variabile fornita:
<?php
$a = '12345';
// This works:
echo "qwe{$a}rty"; // qwe12345rty, using braces
echo "qwe" . $a . "rty"; // qwe12345rty, concatenation used
// Does not work:
echo 'qwe{$a}rty'; // qwe{$a}rty, single quotes are not parsed
echo "qwe$arty"; // qwe, because $a became $arty, which is undefined
?>
SHIFT
premere il tasto per le doppie virgolette e per le parentesi graffe. Sarebbe più veloce se usi rigorosamente le virgolette doppie.
evaluate
invece diparse
Ho anche trovato utile accedere agli attributi degli oggetti in cui i nomi degli attributi variano da un iteratore. Ad esempio, ho usato il modello seguente per un set di periodi di tempo: ora, giorno, mese.
$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
$this->{'value_'.$period}=1;
}
Lo stesso modello può essere utilizzato anche per accedere ai metodi di classe. Crea il nome del metodo nello stesso modo, usando stringhe e variabili stringa.
Si potrebbe facilmente argomentare di utilizzare un array per la memorizzazione dei valori per periodo. Se questa applicazione fosse solo PHP, sarei d'accordo. Uso questo modello quando la classe attribuisce i campi a una tabella del database. Sebbene sia possibile archiviare array in un database utilizzando la serializzazione, è inefficiente e inutile se i singoli campi devono essere indicizzati. Aggiungo spesso una serie di nomi di campo, digitati dall'iteratore, per il meglio dei due mondi.
class timevalues
{
// Database table values:
public $value_hour; // maps to values.value_hour
public $value_day; // maps to values.value_day
public $value_month; // maps to values.value_month
public $values=array();
public function __construct()
{
$this->value_hour=0;
$this->value_day=0;
$this->value_month=0;
$this->values=array(
'hour'=>$this->value_hour,
'day'=>$this->value_day,
'month'=>$this->value_month,
);
}
}
ecco il codice che ho ricevuto da un plugin wordpress
$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");
Questa è una tecnica davvero utile per formattare stringhe complesse.