17

父.php:

require_once 'child.php';

孩子.php:

echo __FILE__;

它将显示'.../child.php'

我怎样才能得到'.../parent.php'

4

6 回答 6

20

选择的答案仅适用于设置服务器变量的环境,尤其不适用于 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'];
}
于 2011-04-14T23:08:11.000 回答
15
print $_SERVER["SCRIPT_FILENAME"];
于 2009-08-23T13:54:28.173 回答
1

我不认为你能做到这一点:__FILE__魔法常数表明它被写入哪个文件;仅此而已。

如果您想知道最初调用了哪个 PHP 脚本(例如,请求了哪个 URL),您可能会更幸运地查看$_SERVERsuperglobal :它包含许多信息,包括一些对您有帮助的信息(例如SCRIPT_FILENAMEor SCRIPT_NAME; -)

于 2009-08-23T13:55:30.043 回答
0

直接解决:

父脚本:

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__;

你明白了……

于 2015-07-25T13:59:53.080 回答
0

另一种方法(在 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的其他地方找到了解决方案(获取初始运行脚本的绝对路径),同时寻找其他东西,所以修改并添加到这个问题,因为这是我首先登陆的地方!

于 2020-05-28T03:29:50.237 回答
0

你必须使用basename($_SERVER["SCRIPT_FILENAME"]),或者,如果你只喜欢脚本 nam,你可以使用basename($_SERVER["SCRIPT_FILENAME"], '.php').

于 2017-02-11T12:41:47.573 回答