Desugaring PHP语法

jam*_*her -2 php syntactic-sugar

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

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

  • if/endif和其他"替代语法"desugar if { ... }

  • for (expr1; expr2; expr3) { statements; }des to to to expr1; while (expr2) { statements; expr3; }.

  • 我认为以下是真的:$foo只是意味着${'foo'}.也就是说,通过名称引用变量只是通过将表达式计算为字符串而更通用的变量查找的实例.

  • 我认为这:

    <p>foo</p>
    <?php echo 5; ?>
    <p>bar</p>
    
    Run Code Online (Sandbox Code Playgroud)

    对此的厌恶:

    echo "<p>foo</p>\n";
    echo 5;
    echo "<p>bar</p>\n";
    
    Run Code Online (Sandbox Code Playgroud)

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

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

Ja͢*_*͢ck 8

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

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

$words = array('hello', 'wonderful', 'world');
foreach ($words as $word) {
    echo $word;
}
Run Code Online (Sandbox Code Playgroud)

很好,但那太高了; 让我们foreach用一个更简单的替换,for因为我们的数组不是关联的:

for ($i = 0; $i < count($words); ++$i) {
    echo $words[$i];
}
Run Code Online (Sandbox Code Playgroud)

现在放弃for:

$i = 0;
while ($i < count($words) {
    echo $words[$i];
    ++$i;
}
Run Code Online (Sandbox Code Playgroud)

while有点烦人:

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

doPrint($words);
Run Code Online (Sandbox Code Playgroud)

我们真的必须使用一个功能吗?

echo $words[0];
echo $words[1];
echo $words[2];
Run Code Online (Sandbox Code Playgroud)

那些变量怎么了?

echo "hellowonderfulworld";
Run Code Online (Sandbox Code Playgroud)

底线

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

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