Nie jest to nazywane złożonym, ponieważ składnia jest złożona, ale ponieważ pozwala na użycie wyrażeń złożonych.
Za pomocą tej składni można zawrzeć dowolną zmienną skalarną, element tablicy lub właściwość obiektu z reprezentacją ciągu. Po prostu napisz wyrażenie w taki sam sposób, jak wyglądałoby to poza ciągiem, a następnie zawiń je w {i }. Ponieważ {nie można uniknąć zmiany znaczenia, ta składnia zostanie rozpoznana tylko wtedy, gdy $bezpośrednio nastąpi po {. Użyj,
{\$aby uzyskać literał {$. Kilka przykładów, aby to wyjaśnić:
<?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()}";?>
Często ta składnia jest niepotrzebna. Na przykład:
$a ='abcd';
$out ="$a $a";// "abcd abcd";
zachowuje się dokładnie tak samo jak to:
$out ="{$a} {$a}";// same
Tak więc nawiasy klamrowe są niepotrzebne. Ale to :
$out ="$aefgh";
w zależności od poziomu błędu albo nie będzie działać, albo spowoduje błąd, ponieważ nie ma nazwy zmiennej $aefgh, więc musisz wykonać:
za dużo dupków analnych na temat kopiowania / wklejania. Jeśli to ułatwia zrozumienie / znalezienie, to była dobra decyzja. +1 ode mnie, to było dokładnie to, czego szukałem, i nie znalazłem go w podręczniku PHP - może dlatego, że nazywają to właściwą nazwą, czy jakkolwiek. Ale znalazłem to tutaj.
Gabriel Magana
9
W przypadku literalnych curlów należy je podwoić, np $vars='x:3,y:9'; $json="{{$vars}}";. Dzięki artykułowi QiGuang .
Bob Stein,
... lub $out = '$aefgh'; (jeśli potrzebujesz dosłownie $ aefgh)
Roko C. Buljan
Ciekawym przykładem użycia jest SimpleXMLElement: {}służy do uzyskania dostępu do samego węzła, np $element[0]->{0}. Ponieważ właściwość „0” nie może istnieć, uruchomi się __get/ __setmetoda. To w istocie umożliwia alternatywę ArrayAccessdla dostępu do indeksu, np . 3v4l.org/1F254 .
Gajus
2
Jeśli treść w dosłownych nawiasach klamrowych również zawiera zmienne, to dodaj nawiasy klamrowe do każdej zmiennej: $min=1;$max=5; echo ".{{$min},{$max}}"daje .{1,5}(miałem problemy ze stwierdzeniem, gdzie „podwoić [nawiasy klamrowe]” wspomniane w komentarzu @ BobStein)
Xenos
47
Jak dla mnie, nawiasy klamrowe służą jako zamiennik konkatenacji, są szybsze w pisaniu, a kod wygląda na czystszy. Pamiętaj, aby używać podwójnych cudzysłowów („”), ponieważ ich treść jest analizowana przez PHP, ponieważ w pojedynczych cudzysłowach ('') otrzymasz dosłowną nazwę zmiennej pod warunkiem:
<?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?>
„ich treść jest analizowana przez PHP” - jest to mylące. Nie możesz po prostu umieszczać dowolnych wyrażeń PHP w składni nawiasów klamrowych, co właśnie rozumiem przez twój cytat.
Mark Amery
1
IMO, ogólnie rzecz biorąc, nie jest szybsze pisanie w nawiasach. Musisz SHIFTnacisnąć klawisz, aby uzyskać podwójne cudzysłowy i nawiasy klamrowe. Byłoby jednak szybciej, gdybyś ściśle używał podwójnych cudzysłowów.
deflime
2
Dziękujemy za wyróżnienie podwójnych cytatów w pojedynczych cytatach, +1
cameronjonesweb
Chciałbym użyć evaluatezamiastparse
Cholthi Paul Ttiopic
17
Przykład:
$number =4;print"You have the {$number}th edition book";//output: "You have the 4th edition book";
Bez nawiasów klamrowych PHP próbowałoby znaleźć zmienną o nazwie $numberth, która nie istnieje!
Uznałem również, że przydatne jest uzyskiwanie dostępu do atrybutów obiektów, w których nazwy atrybutów różnią się w zależności od iteratora. Na przykład użyłem poniższego wzoru dla zestawu okresów: godziny, dnia, miesiąca.
$periods=array('hour','day','month');foreach($periods as $period){
$this->{'value_'.$period}=1;}
Ten sam wzorzec może być również wykorzystany do uzyskania dostępu do metod klas. Wystarczy zbudować nazwę metody w ten sam sposób, używając ciągów i zmiennych ciągów.
Możesz łatwo argumentować, że po prostu używasz tablicy do przechowywania wartości według okresu. Gdyby ta aplikacja była tylko PHP, zgodziłbym się. Używam tego wzorca, gdy atrybuty klasy są mapowane na pola w tabeli bazy danych. Chociaż możliwe jest przechowywanie tablic w bazie danych przy użyciu serializacji, jest to nieefektywne i bezcelowe, jeśli poszczególne pola muszą być indeksowane. Często dodam tablicę nazw pól, wpisaną przez iterator, dla najlepszego z obu światów.
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,);}}
Odpowiedzi:
Jest to złożona (kręcona) składnia interpolacji łańcuchów. Z instrukcji:
Często ta składnia jest niepotrzebna. Na przykład:
zachowuje się dokładnie tak samo jak to:
Tak więc nawiasy klamrowe są niepotrzebne. Ale to :
w zależności od poziomu błędu albo nie będzie działać, albo spowoduje błąd, ponieważ nie ma nazwy zmiennej
$aefgh
, więc musisz wykonać:źródło
$vars='x:3,y:9'; $json="{{$vars}}";
. Dzięki artykułowi QiGuang .$out = '$aefgh'
; (jeśli potrzebujesz dosłownie $ aefgh)SimpleXMLElement
:{}
służy do uzyskania dostępu do samego węzła, np$element[0]->{0}
. Ponieważ właściwość „0” nie może istnieć, uruchomi się__get
/__set
metoda. To w istocie umożliwia alternatywęArrayAccess
dla dostępu do indeksu, np . 3v4l.org/1F254 .$min=1;$max=5; echo ".{{$min},{$max}}"
daje.{1,5}
(miałem problemy ze stwierdzeniem, gdzie „podwoić [nawiasy klamrowe]” wspomniane w komentarzu @ BobStein)Jak dla mnie, nawiasy klamrowe służą jako zamiennik konkatenacji, są szybsze w pisaniu, a kod wygląda na czystszy. Pamiętaj, aby używać podwójnych cudzysłowów („”), ponieważ ich treść jest analizowana przez PHP, ponieważ w pojedynczych cudzysłowach ('') otrzymasz dosłowną nazwę zmiennej pod warunkiem:
źródło
SHIFT
nacisnąć klawisz, aby uzyskać podwójne cudzysłowy i nawiasy klamrowe. Byłoby jednak szybciej, gdybyś ściśle używał podwójnych cudzysłowów.evaluate
zamiastparse
Przykład:
Bez nawiasów klamrowych PHP próbowałoby znaleźć zmienną o nazwie
$numberth
, która nie istnieje!źródło
Uznałem również, że przydatne jest uzyskiwanie dostępu do atrybutów obiektów, w których nazwy atrybutów różnią się w zależności od iteratora. Na przykład użyłem poniższego wzoru dla zestawu okresów: godziny, dnia, miesiąca.
Ten sam wzorzec może być również wykorzystany do uzyskania dostępu do metod klas. Wystarczy zbudować nazwę metody w ten sam sposób, używając ciągów i zmiennych ciągów.
Możesz łatwo argumentować, że po prostu używasz tablicy do przechowywania wartości według okresu. Gdyby ta aplikacja była tylko PHP, zgodziłbym się. Używam tego wzorca, gdy atrybuty klasy są mapowane na pola w tabeli bazy danych. Chociaż możliwe jest przechowywanie tablic w bazie danych przy użyciu serializacji, jest to nieefektywne i bezcelowe, jeśli poszczególne pola muszą być indeksowane. Często dodam tablicę nazw pól, wpisaną przez iterator, dla najlepszego z obu światów.
źródło
oto kod, który otrzymałem z jednej wtyczki wordpress
Jest to naprawdę przydatna technika formatowania złożonych ciągów.
źródło