【发布时间】:2010-11-22 01:28:29
【问题描述】:
父.php:
require_once 'child.php';
child.php:
echo __FILE__;
它将显示'.../child.php'
我怎样才能得到'.../parent.php'
【问题讨论】:
父.php:
require_once 'child.php';
child.php:
echo __FILE__;
它将显示'.../child.php'
我怎样才能得到'.../parent.php'
【问题讨论】:
print $_SERVER["SCRIPT_FILENAME"];
【讨论】:
我不认为你能做到这一点:__FILE__ 魔术常数表示它被写入哪个文件;仅此而已。
如果您想知道最初调用了哪个 PHP 脚本(例如,请求了哪个 URL),查看 $_SERVER superglobal 可能会更幸运:它包含许多信息,包括一些对您有帮助的信息 (例如SCRIPT_FILENAME 或SCRIPT_NAME) ;-)
【讨论】:
选择的答案仅适用于设置服务器变量的环境,尤其不适用于 CLI 脚本。此外,它不确定父级,而只确定最顶层的脚本文件。
您可以通过查看 $argv[0] 在 CLI 脚本中执行几乎相同的操作,但这并不能提供完整路径。
环境无关方案使用debug_backtrace:
function get_topmost_script() {
$backtrace = debug_backtrace(
defined("DEBUG_BACKTRACE_IGNORE_ARGS")
? DEBUG_BACKTRACE_IGNORE_ARGS
: FALSE);
$top_frame = array_pop($backtrace);
return $top_frame['file'];
}
【讨论】:
array_shift()会导致函数返回包含get_topmost_script()的脚本文件名,即__FILE__。
直接解决:
父脚本:
echo $_SERVER['SCRIPT_FILENAME'];
子脚本(包含在父脚本中的文件):
echo __FILE__;
创建一个名为“parent.php”的文件,内容如下:
include('child.php');
创建一个名为“child.php”的文件,内容如下:
echo "My Parent is at: " . $_SERVER['SCRIPT_FILENAME'] . "<br>";
echo "I'm at: " . __FILE__;
你懂的……
【讨论】:
你必须使用basename($_SERVER["SCRIPT_FILENAME"]),或者,如果你只喜欢脚本名称,你可以使用basename($_SERVER["SCRIPT_FILENAME"], '.php')。
【讨论】:
执行此操作的另一种方法(在 Apache 和 CLI 下都可以使用)是使用 get_included_files() 函数。它按运行顺序返回一个包含所有包含文件(包括初始调用脚本)的数组。
get_included_files()[0] = 初始脚本的完整路径。
例如
/myscripts/Parent.php
<?php
echo("Called from parent: ".get_included_files()[0]."\r\n");
include("/otherscripts/Child.php");
echo("Called again from parent: ".get_included_files()[0]."\r\n");
?>
/otherscripts/Child.php
<?php
echo("Called from child: ".get_included_files()[0]."\r\n");
?>
输出:
> php /myscripts/Parent.php
Called from parent: /myscripts/Parent.php
Called from Child: /myscripts/Parent.php
Called again from parent: /myscripts/Parent.php
我最终在 stackoverflow (Get absolute path of initially run script) 上的其他地方找到了解决此问题的方法,同时还在寻找其他内容,因此我已修改并添加到此问题中,因为这是我首先登陆的地方!
【讨论】: