【问题标题】:Desugaring PHP syntax [closed]脱糖 PHP 语法 [关闭]
【发布时间】:2014-01-03 08:31:27
【问题描述】:

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

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

  • if/endif 和其他“替代语法”脱糖为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";
    

    或者一般来说,?&gt;blah&lt;?php 仅表示echo 'blah';

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

【问题讨论】:

  • 我通常写&lt;?= 5 ?&gt;而不是&lt;?php echo 5; ?&gt;
  • 你真的觉得for是语法糖吗? :)
  • @jameshfisher 请参阅:stackoverflow.com/help/dont-ask,这很可能是您被否决的原因。
  • @jameshfisher 恐怕这个问题太宽泛了;一个好的答案必须对 every PHP 结构进行脱糖,您也没有说明您认为哪些语句是无糖的。
  • @jameshfisher 仍然太宽泛;根据定义,列表答案太长了。此外,你永远无法得到一个完整的列表,因为每个 PHP 版本都会带来越来越多的糖。

标签: php syntactic-sugar


【解决方案1】:

这样,我定义语义的句法形式就更少了。

我认为你从错误的角度来处理这个问题。让我们从一个例子开始:

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

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

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

底线

不要试图将语言分解为基础;语言的表现力是有原因的,要在正确的情况下使用。先学基础,再学尽可能多的“糖”。

为了精通一门语言,您至少应该尝试过该语言提供的大部分功能。练习,练习,练习!

【讨论】:

  • foreach 真的这样脱糖吗?我认为它会迭代键值映射,这比您的 for 循环更通用。另外,也许你误解了我的意思。 “首先学习基础知识,然后尽可能多地学习“糖”。这正是我的目标:找出“基础”的语义,然后学习更琐碎的句法糖。但是,我需要首先确定什么是“基础”。 :-)
  • @jameshfisher 可以用reset()each()进行更一般的分解;另外,这只是一个例子:)
  • @jameshfisher 你的问题是要糖;建议您应该从查看非糖开始
  • @Jack,啊,这很有用,谢谢!我不知道可以通过 API 访问数组游标。
猜你喜欢
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 2021-07-09
  • 2012-09-16
  • 2015-11-16
相关资源
最近更新 更多