2013-12-16 81 views
-3

作爲學習PHP的一部分,我試圖正式化它的語義。簡化這項任務的一個好方法就是儘可能多地理解它的語法,就像更多基本表達式的「語法糖」一樣。這樣,我就可以用更少的語法形式來定義它的語義。Desugaring PHP語法

PHP似乎有大量的可以去糖的語法。一些例子:

  • if/endif等 「替代語法」 desugar到if { ... }

  • for (expr1; expr2; expr3) { statements; } desugars到expr1; while (expr2) { statements; expr3; }

  • 我認爲以下是真的:$foo只是意味着${'foo'}。也就是說,通過名稱來引用一個變量只是通過對一個字符串的表達式進行求值而成爲更一般變量查找的一個實例。

  • 我想這:

    <p>foo</p> 
    <?php echo 5; ?> 
    <p>bar</p> 
    

    desugars這樣:

    echo "<p>foo</p>\n"; 
    echo 5; 
    echo "<p>bar</p>\n"; 
    

    或一般,?>blah<?php只是意味着echo 'blah';

確實有很多許多其他這種情況。 我想列出一份綜合清單,並確認其準確無誤。 (而且我的任何例子都可能不準確,所以請糾正我!)

+0

我通常寫''而不是'<?php echo 5; ?>' – saada

+2

你真的覺得'for'是語法糖嗎? :) –

+0

* * blah *示例完全不正確。 '?> blah <?php'不包含可執行的PHP部分。您將PHP完全從圖片中取出,只需將* blah *發送到正在使用的輸出管道/緩衝區等。 – Phil

回答

7

這樣,我定義語義的語法形式就少了。

我想你是從錯誤的角度來接近這個。我們以一個例子開始吧:

$words = array('hello', 'wonderful', 'world'); 
foreach ($words as $word) { 
    echo $word; 
} 

不錯,但這太高了;讓我們來代替foreach用一個簡單的for因爲我們的陣列不是聯想:

for ($i = 0; $i < count($words); ++$i) { 
    echo $words[$i]; 
} 

已掉落for

$i = 0; 
while ($i < count($words) { 
    echo $words[$i]; 
    ++$i; 
} 

while是那種討厭的:

function doPrint($words, $i = 0) 
{ 
    if ($i < count($words)) { 
     echo $words[$i]; 
    } 
    doPrint($words, $i + 1); 
} 

doPrint($words); 

我們真的必須使用功能?

echo $words[0]; 
echo $words[1]; 
echo $words[2]; 

這些變量是怎麼回事?

echo "hellowonderfulworld"; 

底線

不要試圖打破語言下的基本知識;在某種語言中的表現力是有原因的,在正確的情況下使用。先學習基礎知識,然後儘可能多地學習「糖」。

爲了能夠流利地使用某種語言,您至少應該嘗試過該語言的大部分內容。練習,練習,練習!

+0

'foreach'真的是這樣嗎?我認爲它遍歷鍵值映射,它比'for'循環更普遍。另外,也許你誤解了我。 '先學習基礎知識,然後儘可能多地學習「糖」。這正是我所瞄準的目標:弄清楚「基礎」的語義,然後學習更瑣碎的語法糖。但是,我需要確定「基礎」是什麼。 :-) – jameshfisher

+0

@jameshfisher它可以通過'reset()'和'each()'進行更一般的分解。此外,這只是一個例子:) –

+0

@jameshfisher你的問題是要求糖;建議你應該先看看非糖 –