Geschweifte Klammern in der Zeichenfolge in PHP

Antworten:

281

Dies ist die komplexe (geschweifte) Syntax für die String-Interpolation. Aus dem Handbuch:

Komplexe (lockige) Syntax

Dies wird nicht als komplex bezeichnet, da die Syntax komplex ist, sondern weil komplexe Ausdrücke verwendet werden können.

Über diese Syntax kann jede skalare Variable, jedes Array-Element oder jede Objekteigenschaft mit einer Zeichenfolgendarstellung eingeschlossen werden. Schreiben Sie den Ausdruck einfach so, wie er außerhalb der Zeichenfolge erscheinen würde, und wickeln Sie ihn dann in {und ein }. Da {nicht maskiert werden kann, wird diese Syntax nur erkannt, wenn die $unmittelbar auf die folgt {. Verwenden Sie {\$, um ein Literal zu erhalten {$. Einige Beispiele, um es klar zu machen:

<?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()}";
?>

Oft ist diese Syntax nicht erforderlich. Zum Beispiel:

$a = 'abcd';
$out = "$a $a"; // "abcd abcd";

verhält sich genauso:

$out = "{$a} {$a}"; // same

Die geschweiften Klammern sind also nicht erforderlich. Aber das :

$out = "$aefgh";

Abhängig von Ihrer Fehlerstufe funktioniert dies entweder nicht oder führt zu einem Fehler, da keine Variable benannt $aefghist. Sie müssen also Folgendes tun:

$out = "${a}efgh"; // or
$out = "{$a}efgh";
Cletus
quelle
40
zu viel Anal-Nitpicking über Kopieren / Einfügen. Wenn es leicht zu verstehen / zu finden ist, war es eine gute Entscheidung. +1 von mir, es war genau das, wonach ich gesucht habe, und ich habe es nicht im PHP-Handbuch gefunden - vielleicht weil sie es beim richtigen Namen nennen oder was auch immer. Aber ich habe es hier gefunden.
Gabriel Magana
9
Verdoppeln Sie wörtliche Locken, z $vars='x:3,y:9'; $json="{{$vars}}";. Dank QiGuangs Artikel .
Bob Stein
... oder $out = '$aefgh'; (wenn Sie die buchstäblich $ aefgh brauchen)
Roko C. Buljan
Interessantes Anwendungsfallbeispiel ist SimpleXMLElement: {}wird verwendet, um auf den Knoten selbst zuzugreifen, z $element[0]->{0}. Da die Eigenschaft "0" nicht existieren kann, wird __get/ __setmethod ausgelöst . Dies ermöglicht Ihnen im Wesentlichen eine Alternative zum IndexzugriffArrayAccess , z . B. 3v4l.org/1F254 .
Gajus
2
Wenn ein Inhalt in wörtlichen geschweiften Klammern auch Variablen enthält, fügen Sie jeder Variablen geschweifte Klammern hinzu : $min=1;$max=5; echo ".{{$min},{$max}}"Erträge .{1,5}(ich hatte Probleme zu wissen, wo ich "die geschweiften Klammern verdoppeln" soll, wie in @ BobSteins Kommentar erwähnt)
Xenos
46

Geschweifte Klammern dienen für mich als Ersatz für die Verkettung, sind schneller zu tippen und der Code sieht sauberer aus. Denken Sie daran, doppelte Anführungszeichen ("") zu verwenden, da deren Inhalt von PHP analysiert wird, da in einfachen Anführungszeichen ('') der Literalname der angegebenen Variablen angezeigt wird:

<?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

?>
Kredo900
quelle
1
"Ihr Inhalt wird von PHP analysiert" - Dies ist irreführend. Sie können nicht einfach beliebige PHP-Ausdrücke in die geschweifte Klammer-Syntax einfügen, was ich in Ihrem Zitat gelesen habe.
Mark Amery
1
IMO, insgesamt ist es nicht schneller, mit Klammern zu tippen. Sie müssen SHIFTdie doppelten Anführungszeichen und die geschweiften Klammern drücken. Es wäre jedoch schneller, wenn Sie ausschließlich doppelte Anführungszeichen verwenden.
Deflime
2
Vielen Dank für das Hervorheben von doppelten Anführungszeichen v einfache Anführungszeichen, +1
cameronjonesweb
Ich würde evaluateanstelle vonparse
Cholthi Paul Ttiopic
17

Beispiel:

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

Ohne geschweifte Klammern würde PHP versuchen, eine Variable mit dem Namen zu finden $numberth, die es nicht gibt!

Obiware
quelle
3

Ich fand es auch nützlich, auf Objektattribute zuzugreifen, bei denen die Attributnamen je nach Iterator variieren. Zum Beispiel habe ich das folgende Muster für eine Reihe von Zeiträumen verwendet: Stunde, Tag, Monat.

$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
    $this->{'value_'.$period}=1;
}

Das gleiche Muster kann auch für den Zugriff auf Klassenmethoden verwendet werden. Bauen Sie den Methodennamen einfach auf die gleiche Weise mit Zeichenfolgen und Zeichenfolgenvariablen auf.

Sie könnten leicht argumentieren, nur ein Array für die Wertspeicherung nach Zeitraum zu verwenden. Wenn diese Anwendung nur PHP wäre, würde ich zustimmen. Ich verwende dieses Muster, wenn die Klassenattribute Feldern in einer Datenbanktabelle zugeordnet sind. Während es möglich ist, Arrays mithilfe der Serialisierung in einer Datenbank zu speichern, ist es ineffizient und sinnlos, wenn die einzelnen Felder indiziert werden müssen. Ich füge oft ein Array der vom Iterator eingegebenen Feldnamen hinzu, um das Beste aus beiden Welten zu erzielen.

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,
        );
    }
}
Ray N. Franklin
quelle
-5

Hier ist der Code, den ich von einem WordPress-Plugin erhalten habe

$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");

Dies ist eine sehr praktische Technik zum Formatieren komplexer Zeichenfolgen.

user1232972
quelle