40

根据标题,是否有 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() 的解决方案的两倍。

4

4 回答 4

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

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

于 2010-03-10T01:58:01.343 回答
12
if ($argv && $argv[0] && realpath($argv[0]) === __FILE__) {
    // ...
}

奇迹般有效。

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

于 2015-11-06T11:10:03.983 回答
1

您可能想要“魔术常数”之一。取决于你想要做什么__FILE____FUNCTION__或者__CLASS__可能会给你你想要的信息。

它们是不言自明的:

  • __FILE__给你当前的文件名
  • __FUNCTION__给你当前函数的名字
  • __CLASS__给你当前类的名称。

查看手册了解更多详情

于 2010-03-10T01:59:26.897 回答
0
if(get_included_files()[0] == __FILE__) doStuff();
于 2022-02-11T16:16:03.907 回答