2013-12-16 36 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你的问题是要求糖;建议你应该先看看非糖 –