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:
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?>
"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!
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_hourpublic $value_day;// maps to values.value_daypublic $value_month;// maps to values.value_monthpublic $values=array();publicfunction __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,);}}
Antworten:
Dies ist die komplexe (geschweifte) Syntax für die String-Interpolation. Aus dem Handbuch:
Oft ist diese Syntax nicht erforderlich. Zum Beispiel:
verhält sich genauso:
Die geschweiften Klammern sind also nicht erforderlich. Aber das :
Abhängig von Ihrer Fehlerstufe funktioniert dies entweder nicht oder führt zu einem Fehler, da keine Variable benannt
$aefgh
ist. Sie müssen also Folgendes tun:quelle
$vars='x:3,y:9'; $json="{{$vars}}";
. Dank QiGuangs Artikel .$out = '$aefgh'
; (wenn Sie die buchstäblich $ aefgh brauchen)SimpleXMLElement
:{}
wird verwendet, um auf den Knoten selbst zuzugreifen, z$element[0]->{0}
. Da die Eigenschaft "0" nicht existieren kann, wird__get
/__set
method ausgelöst . Dies ermöglicht Ihnen im Wesentlichen eine Alternative zum IndexzugriffArrayAccess
, z . B. 3v4l.org/1F254 .$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)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:
quelle
SHIFT
die doppelten Anführungszeichen und die geschweiften Klammern drücken. Es wäre jedoch schneller, wenn Sie ausschließlich doppelte Anführungszeichen verwenden.evaluate
anstelle vonparse
Beispiel:
Ohne geschweifte Klammern würde PHP versuchen, eine Variable mit dem Namen zu finden
$numberth
, die es nicht gibt!quelle
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.
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.
quelle
Hier ist der Code, den ich von einem WordPress-Plugin erhalten habe
Dies ist eine sehr praktische Technik zum Formatieren komplexer Zeichenfolgen.
quelle