为什么只用一个冒号调用静态方法不会导致解析错误? [重复]

问题描述 投票:0回答:1

当调用以下代码时,我很惊讶没有抛出解析错误或给出其他错误,因为此代码看起来不正确。 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";
}

现在显然代码缺少额外的

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

但是实际输出是...

xyz

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

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

现在显然我可以添加

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

php operators symbols
1个回答
5
投票

冒号还用于可以作为

goto
的目标的语句标签。

ABC:xyz();

echo 'foo';
goto ABC;

如果您的脚本中没有

goto ABC
,则该标签将被忽略。

这与

onclick="javascript:xyz()"
在 HTML/JS 中工作的原因相同。许多程序员这样写是因为他们将其与
href="javascript:xyz()"
混淆了(其中
javascript:
是 URI 方案,指示 URI 的其余部分应作为 JS 执行)。但是
onXXX
属性始终包含 JS,在这种情况下
javascript:
是一个被忽略的标签。

© www.soinside.com 2019 - 2024. All rights reserved.