Was bedeutet { }
(geschweifte Klammern) in String-Literalen in PHP?
Was bedeutet { }
(geschweifte Klammern) in String-Literalen in PHP?
Antworten:
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 $aefgh
ist. Sie müssen also Folgendes tun:
$out = "${a}efgh"; // or
$out = "{$a}efgh";
$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:
<?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
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
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,
);
}
}
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.