PHP中等同于Python的__name__ == "__main__"的语句是什么?

44

与标题相符,是否有 PHP 等效于 __name__ == "__main__" 的功能?

是否有适用于通过命令行和 Web 请求执行的脚本的内容,或者需要自定义函数?

对于不熟悉 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() 的解决方案快两倍左右。


我的答案和count(debug_backtrace())怎么样? - zerkms
4个回答

34

1
它如何变得更明显?代码中的“if(!debug_backtrace())”清楚地表示“如果没有回溯,那么...”。因此,这可能是微观优化,但为什么编写某些被认为不太清晰且速度较慢的代码呢? - Shabbyrobe
2
只是提醒一下,代码片段中有一个错误,if条件需要在末尾加上一个额外的闭合括号。无法编辑它,因为编辑需要6个或更多字符。 - Craig Sefton
2
非常非常非常糟糕的回答...完全没有任何解释。你看,程序员永远不应该只因为代码可用就使用它,这是最糟糕的坏习惯。 - Iharob Al Asimi
1
是的,但这是一个问答网站。至少一些解释会很好。仅发布代码是不好的。特别是考虑到PHP并没有最好的文档。 - Iharob Al Asimi
1
为了稍微优化一下,您可以使用DEBUG_BACKTRACE_IGNORE_ARGS标志来减少内存使用。 - alexandre-rousseau
显示剩余11条评论

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

效果非常好。

当您在命令行中运行php时,php文件的名称将作为$argv[0]参数传递给程序,并且 __FILE__魔术变量表示当前文件。因此,我们通过逻辑比较检查运行的程序是否等于Python的__name__ == "__main__"


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

1

你可能需要其中一个“魔术常量”。根据你想要做什么,__FILE____FUNCTION____CLASS__可能会给你所需的信息。

它们都很容易理解:

  • __FILE__ 给出当前文件名
  • __FUNCTION__ 给出当前函数名
  • __CLASS__ 给出当前类名

请查看手册以获取更多详细信息。


可能,但我该如何使用它们来实现我所要求的内容? - Shabbyrobe
看起来你已经在自己的答案中解决了它 :) - Brenton Alker
8
我认为(realpath($argv[0]) == __FILE__)可能会起作用。 - Darien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接