Parentesi graffe ricci in stringa in PHP


Risposte:


281

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";

40
troppa nitpicking anale su copia / incolla. Se è facile da capire / trovare, è stata una buona decisione. +1 da me, era esattamente quello che stavo cercando, e non l'ho trovato nel manuale di PHP - forse perché lo chiamano con il nome proprio o altro. Ma l'ho trovato qui.
Gabriel Magana,

9
Per i ricci letterali, raddoppiali, ad es $vars='x:3,y:9'; $json="{{$vars}}";. Grazie all'articolo di QiGuang .
Bob Stein,

... O $out = '$aefgh'; (se hai bisogno letteralmente di $ aefgh)
Roko C. Buljan,

Esempio di caso d'uso interessante è SimpleXMLElement: {}viene utilizzato per accedere al nodo stesso, ad es $element[0]->{0}. Poiché la proprietà "0" non può esistere, questo attiverà __get/ __setmethod. Questo in sostanza ti offre un'alternativa ArrayAccessall'accesso all'indice, ad esempio 3v4l.org/1F254 .
Gajus,

2
Se un contenuto all'interno di parentesi graffe letterali contiene anche variabili, quindi aggiungi parentesi graffe a ogni variabile: $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)
Xenos

47

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

?>

1
"il loro contenuto è analizzato da PHP" - Questo è fuorviante. Non puoi semplicemente inserire espressioni PHP arbitrarie nella sintassi del parentesi graffa, che è ciò che ho letto la tua citazione per significare.
Mark Amery,

1
IMO, nel complesso, non è più veloce digitare con parentesi. Devi SHIFTpremere il tasto per le doppie virgolette e per le parentesi graffe. Sarebbe più veloce se usi rigorosamente le virgolette doppie.
Define

2
Grazie per aver evidenziato le virgolette doppie rispetto alle virgolette singole, +1
cameronjonesweb

Vorrei usare evaluateinvece diparse
Cholthi Paul Ttiopic il

17

Esempio:

$number = 4;
print "You have the {$number}th edition book";
//output: "You have the 4th edition book";

Senza parentesi graffe, PHP proverebbe a trovare una variabile chiamata $numberth, che non esiste!


3

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,
        );
    }
}

-5

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.

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.