2014-09-30 37 views
7
$name = "jason"; 
$p = "hello-{hello2}-$name-{$name}"; 
echo $p; 

wyjściowa:Co {} robi w ciągu znaków?

hello-{hello2}-jason-jason 

Natknąłem kilka przykładów przygotowanych sprawozdań i zauważyłem tego. Jeśli obejmuje zmienną, usuwa je, w przeciwnym razie zachowuje je. Dlaczego jest to konieczne zachowanie podczas

echo "$name"; 

dostaje taki sam wynik jak

echo "{$name}"; 

czy jest to tylko czytelność?

+2

Służy do oddzielania zmiennej od napisu, w przypadku "echo" lubię {$ str} s dużo "; 'nie będzie można tego zrobić bez użycia {}. – BojanT

+0

Pamiętaj: jeśli natknąłeś się na tych w "przygotowanym oświadczeniu" _, są szanse, że nie są to "prawdziwe" przygotowane stwierdzenia. – Wrikken

Odpowiedz

12

Jest używany jako ogranicznik dla zmiennych w ciągach. Jest to konieczne w niektórych przypadkach, ponieważ parser PHP nie jest chciwym ai źle interpretuje wiele popularnych struktur.

np.

$foo = array(); 
$foo['bar'] = array(); 
$foo['bar']['baz'] = 'qux'; 

echo "Hello $foo[bar][baz]"; 

rzeczywiście wydrukować

Hello Array[baz] 

Ponieważ jest analizowany jako

echo "Hello ", $foo['bar'], "[baz]"; 
     ^  ^  ^
     string  array  string 

Korzystanie {} sił PHP rozważyć odwołanie do tablicy jako pojedyncze jednostki:

echo "Hello, {$foo['bar']['baz']}"; // prints "Hello, qux" 

Pomaga także różnicować dwuznaczne rzeczy

$foo = 'bar'; 

echo "$foos" // undefined variable 'foos' 
echo "{$foo}s" // variable containing 'bar' + string 's' 
+0

Pokonaj mnie sekundą, miło. – Dexa

+0

echo "Witaj, {$ foo ['bar'] ['baz']}"; Bum idzie dynamitem! Ma sens, widzę, dlaczego teraz to zrobili. Wygrywasz zielony znacznik wyboru dla dostarczania przykładów kodu. Dziękuję Ci! – jason

+0

Właśnie zdałem sobie sprawę, że masz reputację 200k. Szukałem kogoś, kogo by zapytać: czy czujesz, że wiesz wszystko o php? Studiowałem to od dawna i wydaje się, że jest przytłaczająca, ilość rzeczy, które trzeba wiedzieć, "gotchas", subtelność. Czy zapamiętywasz funkcje, parametry lub czy wciąż szukasz wielu rzeczy? Muszę wyglądać prawie wszystko. Wiem, że X MOŻNA zrobić, ale nie zawsze dokładnie to, która kombinacja obiektów/funkcji byłaby najlepsza. Czy piszesz więcej kodu proceduralnego lub oop? Im około 50/50. W każdym razie, dziękuję jeszcze raz za odpowiedź na moje pytanie źródłowe. – jason

4

To coś, co nazywa "kompleks składnia"

Od php.net można przejść do Complex (kręcone) składnia części i zobaczyć wiele przykładów.

Complex składnia (kręcone)

To nie nazywa się skomplikowane, ponieważ składnia jest skomplikowane, ale dlatego, że pozwala na stosowanie złożonych wyrażeń.

Dowolna zmienna skalarna, element tablicy lub właściwość obiektu z reprezentacją łańcuchów mogą być zawarte w tej składni. Po prostu napisz wyrażenie w taki sam sposób, w jaki pojawi się poza ciągiem, a następnie zawiń go w {i}. Ponieważ {nie da się uciec, ta składnia zostanie rozpoznana tylko wtedy, gdy $ natychmiast podąża za {. Użyj {\ $, aby uzyskać dosłowne {$.

Funkcje, wywołania metod, statyczne zmienne klasy i stałe klasy wewnątrz {$} działają od PHP 5. Jednak wartość dostępna będzie interpretowana jako nazwa zmiennej w zakresie, w którym łańcuch jest zdefiniowany. Używanie pojedynczych nawiasów klamrowych ({}) nie będzie działać, aby uzyskać dostęp do wartości zwracanych funkcji lub metod lub wartości stałych klas lub statycznych zmiennych klas.

1

To niekoniecznie generują ten sam wynik:

$name = 'foo'; 
$names = 'bar'; 

echo "Output1: $names"; 
echo "Output2: {$name}s"; 

Output

Output1: bar 
Output2: foos 

Ponadto można uzyskać dostęp do złożonych struktur poprzez składni kręcone jak {$foo->bar} .

0

Ta składnia jest przydatna, gdy chcesz wyświetlić zmienną po pewnym ciągu znaków i nie chcesz żadnego spacji między nimi.

Porównaj następujące:

<?php 

$name='John'; 

echo "My name is $nameathan. I'm twenty years old<br />"; 
echo "My name is {$name}athan. I'm twenty years old<br />"; 

To daje wyniki:

Notice: Undefined variable: nameathan in ... on line 5 
My name is . I'm twenty years old 
My name is Johnathan. I'm twenty years old 

Na pierwszy echo będzie generować powiadomienia i nie będzie działać zgodnie z oczekiwaniami, ponieważ PHP nie wiedzieć, że chcesz użyć zmiennej $name w ciągu znaków, a nie $nameathan. Używanie nawiasów klamrowych w drugim przypadku rozwiązuje problem.

oczywiście można złączyć Ciąg ten sposób:

echo "My name is $name"."athan. I'm twenty years old<br />"; 

a także rozwiązuje problem, ale jeśli masz wiele takich zmiennych łańcucha będzie znacznie wygodniejsze w użyciu nawiasów klamrowych.