PHP 相当于 Python 的 __name__ == "__main__"?

Posted

技术标签:

【中文标题】PHP 相当于 Python 的 __name__ == "__main__"?【英文标题】:PHP equivalent of Python's __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())怎么样? 【参考方案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__) 可能会这样做。

以上是关于PHP 相当于 Python 的 __name__ == "__main__"?的主要内容,如果未能解决你的问题,请参考以下文章

node.js 相当于 python 的 if __name__ == '__main__' [重复]

是否有相当于 PHP 的 $name = $_GET['name'] 的 JQuery 或 JS

python 中 __init__方法

Python学习_20171126_列表

python主文件判定

Python中__init__()方法注意点