PHP中等价于Python的__name__ == "__main__"是什么?

44 投票
4 回答
7101 浏览
提问于 2025-04-15 20:14

根据标题,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的回答是最好的,但有一点不太对——应该是这样写:

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

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

4 个回答

2
if(get_included_files()[0] == __FILE__) doStuff();

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

14
if ($argv && $argv[0] && realpath($argv[0]) === __FILE__) {
    // ...
}

效果非常好。

当你在命令行中运行PHP时,PHP文件的名字会作为 $argv[0] 传递给程序,而 __FILE__ 这个特殊变量代表当前文件。所以我们可以通过检查运行的程序是否是当前文件,来逻辑上等同于Python中的 __name__ == "__main__"

34
if (!count(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)))
{
    // some usefull stuff
}

想了解更多关于debug_backtrace这个函数的内容,可以去看看这个链接:https://www.php.net/manual/en/function.debug-backtrace.php

撰写回答