Desugaring PHP语法

时间:2013-12-16 02:44:09

标签: php syntactic-sugar

作为学习PHP的一部分,我正在尝试将其语义形式化。简化此任务的一个好方法是尽可能多地理解其语法作为更多基本表达式的“语法糖”。这样,我可以用更少的句法形式来定义语义。

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

  • if/endif以及其他“替代语法”desugar to if { ... }等。

  • for (expr1; expr2; expr3) { statements; }去了expr1; while (expr2) { statements; expr3; }

  • 我认为以下情况属实:$foo仅表示${'foo'}。也就是说,通过名称引用变量只是通过将表达式计算为字符串而更通用的变量查找的实例。

  • 我想:

    <p>foo</p>
    <?php echo 5; ?>
    <p>bar</p>
    
    对此不以为然:

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

    或者一般而言,?>blah<?php仅表示echo 'blah';

肯定会有很多这样的案例。 我想提出一份全面且确认准确的清单。 (我的任何一个例子都可能不准确,所以请纠正我!)

1 个答案:

答案 0 :(得分:8)

  

这样,我可以用更少的句法形式来定义语义。

我认为你是从错误的角度接近这个。让我们从一个例子开始:

$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";

底线

不要试图将语言分解为基础;语言中的表达力是有原因的,可以在适当的情况下使用。首先学习基础知识,然后尽可能多地学习“糖”。

为了能够流利使用某种语言,您至少应该尝试使用该语言提供的大部分内容。练习,练习,练习!