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

輸出:{}在字符串中做什麼?

hello-{hello2}-jason-jason 

碰到預處理語句的一些例子,注意到這一點。如果它包含一個變量,它會將其刪除,否則它會保留它們。爲什麼這種行爲在必要時

echo "$name"; 

讓你得到相同的結果

echo "{$name}"; 

或只是可讀性?

+2

它用於從字符串中分離變量,例如'echo「我喜歡{$ str} s很多」; '使用{}語法無法做到這一點。 – BojanT 2014-09-30 15:09:28

+0

請注意:如果您在_「準備好的聲明」中遇到過_,那麼很可能他們並不是真正準備好的聲明。 – Wrikken 2014-09-30 15:18:58

回答

12

它作爲在字符串變量的分隔符。在某些情況下這是必要的,因爲PHP的字符串解析器不是貪婪的,並且會錯誤地解釋許多常見的結構。

例如

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

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

將實際打印

Hello Array[baz] 

因爲它解析爲

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

使用{}力量PHP考慮數組引用作爲單一實體:

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

它還有助於區分不明確的東西

$foo = 'bar'; 

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

第二次打我,很好。 – Dexa 2014-09-30 15:11:14

+0

echo「你好,{$ foo ['bar'] ['baz']}」;轟隆去炸藥!有道理,我可以看到他們爲什麼現在這樣做。您贏得了提供代碼示例的綠色複選標記。謝謝! – jason 2014-09-30 15:16:52

+0

剛剛意識到你有200k的聲望。我一直在尋找有人問:你覺得你知道關於PHP的一切嗎?我一直在研究它很長一段時間,它似乎壓倒性的,知道的東西的數量,'陷阱',微妙。你記住函數,參數還是你仍然查找很多東西?我必須看到幾乎所有東西。我知道x可以完成,但並不總是確切地說哪個對象/函數的組合最適合這樣做。另外,你寫更多的程序或代碼?我約50/50。無論如何,再次感謝您回答我的原始問題。 – jason 2014-09-30 15:35:43

4

這是一種叫做「複雜的語法」

php.net你可以去複合物(花)語法部分,看到很多例子。

複合物(花)語法

這不叫複雜,因爲語法複雜,而是因爲它允許使用複雜表達式。

任何具有字符串表示形式的標量變量,數組元素或對象屬性均可通過此語法包含在內。簡單地寫出表達式的方式與字符串外部的方式相同,然後將其包裝在{和}中。由於{不能被轉義,這個語法只有在$緊跟在{之後才能被識別。使用{\ $獲取文字{$。

函數,方法調用,靜態類變量和內部自PHP 5. {$}工作類常量然而,訪問的值將被解釋爲在範圍的變量,其中該字符串被定義的名稱。使用單個大括號({})將無法訪問函數或方法的返回值或類常量或靜態類變量的值。

1

它不一定產生相同的輸出:

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

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

輸出

Output1: bar 
Output2: foos 

您也可以通過捲曲語法訪問複雜的結構,如{$foo->bar}

0

當您想要在某個字符串後面顯示變量並且您不希望它們之間有任何空格時,此語法非常有用。

比較如下:

<?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 />"; 

它會給你造成:

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 

對於第一回波它會產生提示,不會按預期工作,因爲PHP不知道你想要在字符串中使用變量$name而不是$nameathan。在第二種情況下使用花括號可以解決問題。

當然,你可以連接字符串是這樣的:

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

,同時也解決了這個問題,但如果你在字符串有很多這樣的變量,這將是更方便使用大括號。

相關問題