【问题标题】:PHP output of __FILE__ inside included file包含文件中 __FILE__ 的 PHP 输出
【发布时间】:2010-10-17 17:31:42
【问题描述】:

好的,这是一个真正的简短查询。 我从函数内部调用__FILE__。 现在,这个函数本身在一个必需的文件中。

现在,当我从父文件中调用此函数时,__FILE__ 会输出父文件还是包含的文件?

哦,我正在寻找一个可以确认的来源,如果可能的话,因为我在这里的测试给了我完全荒谬的结果。

另外,如果这应该显示子(包含)文件,我应该怎么做才能显示父文件路径? (一些变化还是什么?)

【问题讨论】:

  • 哦,我不能使用 $_SERVER["SCRIPT_FILENAME"] 因为这个父文件被进一步包含在一个文件中。

标签: php constants


【解决方案1】:

__FILE__ 总是替换为符号所在的文件名。

要获取调用函数的文件名,可以使用debug_backtrace()。这会将当前调用堆栈作为一个数组返回,每个子数组包含进行调用的文件、行和功能键。

您可以将最前面的元素移出数组以获取调用函数的位置:

a.php:

<?php

require_once('b.php');

b();

b.php:

<?php

function b() {
   $bt = debug_backtrace();
   var_export($bt); 
}

输出:

array (
  0 => array (
    'file'     => '/home/meagar/a.php',
    'line'     => 5,
    'function' => 'b',
    'args'     => array( ),
  ),
)

没有函数调用也一样:

a.php:

<?php require_once('b.php');

b.php:

<?php
$bt = debug_backtrace();
var_export($bt);

输出:

array (
  0 => array (
    'file'     => '/home/meagar/a.php',
    'line'     => 3,
    'function' => 'require_once',
  ),
)

【讨论】:

  • 值得一提的是,全局回溯将在包含时调用并存储所有包含层次结构,而本地回溯(在函数内部)将在运行时调用并存储调用堆栈层次结构。它们可能完全不同。
  • @Soaku 关于您的suggested edit,在仅包含 PHP 的文件末尾不需要或不建议使用结束 ?&gt;。您应该将其保留,请不要将其编辑到任何其他问题或答案中。
【解决方案2】:

document 说:

__FILE__
文件的完整路径和文件名。如果在包含中使用,则返回包含文件的名称。

【讨论】:

  • hmm,所以无论如何要获取父文件路径?我不能使用“SCRIPT_FILENAME”,因为父文件也包含在文件中..
【解决方案3】:

这是我如何在我的一个项目中解决此问题的示例。

问题。 我在我的 html 模板的 head 部分调用了以下方法:

public static function loadPageSpecificStyle()
{
    $directory_files = scandir(dirname(__FILE__));

    foreach($directory_files as $key => $file_name)
    {
        if(strpos($file_name, 'css') !== FALSE)
        {
            echo '<link rel="stylesheet" type="text/css" href="' . $file_name . '" />';
        }
    }
}

解决方案。 我将__FILE__ 常量作为参数传递:

public static function loadPageSpecificStyle($file_as_argument)
{
    $directory_files = scandir(dirname($file_as_argument));

    foreach($directory_files as $key => $file_name)
    {
        if(strpos($file_name, 'css') !== FALSE)
        {
            echo '<link rel="stylesheet" type="text/css" href="' . $file_name . '" />';
        }
    }
}

然后在我页面的head 中,我简单地这样调用:WhateverClass::loadPageSpecificStyle(__FILE__);

希望这会有所帮助!

【讨论】:

    【解决方案4】:

    据我所知,您正在寻找的 - 获取“父”包含的路径本身又是一个包含 - 是不可能的,甚至使用 debug_backtrace() 也是不可能的。

    您必须创建自己的包含函数来跟踪包含文件的“堆栈”。

    【讨论】:

    • -1:可以在包含时使用debug_backtrace(),在全局范围内调用它,而不是在函数中(尽管结果可能在之后的函数内部使用)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多