为什么仅使用一个冒号调用静态方法不会导致解析错误?

Sea*_*ney 2 php symbols operators

当调用以下代码时,我很惊讶没有抛出解析错误或给出其他错误,因为此代码看起来不正确。PHP 中的冒号有多种用途,但是,我已经偏离了这一用途,因为我不知道它适合哪个桶。

代码:

<?php
class ABC {
    static function xyz() {
        echo "I don't like the alphabet";
    }
}
ABC:xyz();

// tucked away in a strange file
function xyz() {
    echo "xyz\n";
}
Run Code Online (Sandbox Code Playgroud)

现在显然代码缺少了 extra :,但奇怪的是它的工作原理就好像没有任何问题一样。你认为输出会是什么?Parse Error?对字母表的不友善评论?Undefined ConstantPartial Paamayim Nekudotayim?(好吧!不是真的;给经验丰富的 PHP 专家开个玩笑)

但实际输出是...

xyz
Run Code Online (Sandbox Code Playgroud)

换句话说,代码只用一个冒号运行!但并不像你想象的那样;亲自看看: https: //onlinephp.io/c/e88355

有谁知道为什么会发生这种情况?我能找到的唯一线索是它在 5.2 版本上崩溃了。

现在显然我可以添加:并完成它,但我真的想了解为什么会发生这种情况,因为它提出了一个非常奇怪的错误。那么也许有一个解决方案可以防止此类愚蠢的事情再次发生。

Bar*_*mar 5

冒号还用于可以作为 的目标的语句标签goto

ABC:xyz();

echo 'foo';
goto ABC;
Run Code Online (Sandbox Code Playgroud)

如果您的脚本中没有该goto ABC标签,则该标签将被忽略。

onclick="javascript:xyz()"这与在 HTML/JS 中工作的原因相同。许多程序员之所以这样写,是因为他们将其与href="javascript:xyz()"(where javascript:is the URI schema that indicates the rest of URI should be returned as JS)混淆了。但onXXX属性总是包含 JS,在本例中javascript:是一个被忽略的标签。