【问题标题】:PHP equivalent of Python's __name__ == "__main__"?PHP 相当于 Python 的 __name__ == "__main__"?
【发布时间】:2011-01-25 17:16:02
【问题描述】:

根据标题,是否有 PHP 等效于 __name__ == "__main__"

有什么东西可以同时适用于通过命令行和网络请求执行的脚本,还是需要自定义函数?

对于那些不熟悉 Python 的人,__name__ == "__main__" 允许你定义一个模块文件,如果它是入口点,还有一些东西可以让你运行它。 PHP 中的等效结构如下所示:

// SomeClass.php
<?php
class SomeClass
{
    function doStuff() {
        echo "wahey!\n";
    }
}

// python, I know.
if (__name__ == "__main__") {
    $sc = new SomeClass;
    $sc->doStuff();
}
?>

// OtherClass.php
<?php
require_once("SomeClass.php");
class OtherClass
{
    public $yep;
}
?>

// command line:
php SomeClass.php     // outputs "wahey!"
php OtherClass.php    // outputs nothing

注意zerkms' answer 是最好的,但并不完全正确 - 它应该是:

if (!debug_backtrace()) {
    // do useful stuff
}

这比 !count(debug_backtrace()) 快得多,后者本身的速度大约是我的涉及 realpath() 的解决方案的两倍。

【问题讨论】:

  • 我的答案和count(debug_backtrace())怎么样?

标签: python php main language-comparisons


【解决方案1】:
if (!count(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)))
{
    // some usefull stuff
}

查看https://www.php.net/manual/en/function.debug-backtrace.php 了解有关 debug_backtrace 函数的更多详细信息

【讨论】:

  • 它如何变得更加明显? “if (!debug_backtrace())”清楚地在代码中说“如果没有回溯,那么……”。所以,它可能是微优化,但为什么要编写一些可以说不清晰且速度较慢的代码?
  • 因为它依赖于隐式 php 强制转换 array() -> false。我认为明确的“如果元素计数为 0”更清晰。所以我认为使用你的案例的原因只是“从你的角度来看”而不是“优化问题”
  • 仅供参考,代码 sn-p 中有一个错误,它需要在 if 条件的末尾有一个额外的右括号。不允许我编辑它,因为编辑需要 6 个字符或更多。
  • 非常非常非常糟糕的答案... NO 解释。你看,程序员永远不应该使用代码,因为它可以工作,这是最糟糕的坏习惯。
  • 是的,但它是一个问答网站。至少有一些解释会很好。只发布代码是不好的。特别是考虑到 PHP 没有最好的文档这一事实。
【解决方案2】:
if ($argv && $argv[0] && realpath($argv[0]) === __FILE__) {
    // ...
}

像魅力一样工作。

当您在命令行中运行 php 时,php 文件的名称将作为$argv[0]__FILE__ 魔术变量传递给程序,表示当前文件。所以我们检查正在运行的程序是当前文件逻辑上等于Python的__name__ == "__main__"

【讨论】:

    【解决方案3】:

    您可能想要“魔术常数”之一。根据您要执行的操作,__FILE____FUNCTION____CLASS__ 可能会为您提供所需的信息。

    它们是不言自明的:

    • __FILE__为您提供当前文件名
    • __FUNCTION__ 为您提供当前函数的名称
    • __CLASS__ 为您提供当前班级的名称。

    查看the manual了解更多详情

    【讨论】:

    • 可能,但是我该如何实现我的要求?
    • 看起来您已经在自己的答案中找到了答案:)
    • 我认为(realpath($argv[0]) == __FILE__) 可能会这样做。
    猜你喜欢
    • 2011-06-26
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2011-01-15
    相关资源
    最近更新 更多