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__' [重复]