PHP __FILE__ наследование - PullRequest
       7

PHP __FILE__ наследование

3 голосов
/ 08 августа 2011

Я пытаюсь написать метод, который я могу использовать в расширенных классах, который использует полный путь к файлу.Однако, когда я использую __FILE__, я получаю только путь назад для класса, в котором определен унаследованный метод. Вот пример:

foo.php

class foo 
{

    public function getFullFile()
    {
        return __FILE__;
    }
}

bar.php

class bar extends foo 
{
    public function getFile()
    {
        return __FILE__;
    }

}

example.php

$foo = new foo();
echo $foo->getFullFile() . PHP_EOL;

$bar = new bar();
echo $bar->getFullFile() . PHP_EOL;
echo $bar->getFile() . PHP_EOL;

Результат выполнения example.php:

/my/full/path/foo.php
/my/full/path/foo.php
/my/full/path/bar.php

Это ожидаемое поведение?Есть ли лучший способ сделать это?Я делаю что-то безумно глупое?

Ответы [ 7 ]

6 голосов
/ 08 августа 2011

Нельзя ссылаться на __FILE__ (по указанным причинам ), но вы можете ссылаться на файл, в котором определен класс текущего объекта:

class foo 
{
    public function getFullFile()
    {
        $c = new ReflectionClass($this);
        return $c->getFileName();
    }
}
2 голосов
/ 08 августа 2011

В некотором коде написано более тысячи слов ...

B.php

<?
class B {
  public function bar() {
    return __FILE__;
  }
}

A.php

<?
require "B.php";
class A extends B {
  public function foo() {
    echo parent::bar();
  }
}
$a = new A();
$a->foo();

joe @ joe-desktop: ~$ php A.php

/home/joe/B.php
2 голосов
/ 08 августа 2011

__FILE__ - это всегда файл, на который ссылается константа. Для целей отладки вы можете легко вернуться к точному файлу, в котором находится код, который использует __FILE__. Было бы бесполезно говорить, что это было в 'bar.php', когда определение находится в 'foo.php'.

1 голос
/ 08 августа 2011

Это ожидаемое поведение __FILE__ всегда будет соответствовать имени файла файла, в котором его находит интерпретатор.То же самое с другими магическими константами (__METHOD__, __CLASS__, __LINE__ и т. Д.). Насколько я могу судить, невозможно сделать то, что вы пытаетесь сделать.

1 голос
/ 08 августа 2011

См. http://php.net/manual/en/language.constants.predefined.php для получения дополнительной информации об этих «магических константах».Если я не ошибаюсь, эти магические константы являются своего рода макросами и определяются во время компиляции, а не во время выполнения.

1 голос
/ 08 августа 2011

Я думаю, что если вы хотите, чтобы $bar->getFullFile() вернул bar.php, вам нужно добавить функцию в bar.php.

public function getFullFile() {
  return parent::getFullFile();
}
0 голосов
/ 09 августа 2011

Просто используйте debug_backtrace() функцию PHP.Пример использования (моя библиотечная функция my_die помещена в некоторый включенный php-файл, но сообщает о местонахождении абонентов!):

function my_die($msg)
{
    $bt = debug_backtrace();

    $file = $bt[0]["file"];
    $line = $bt[0]["line"];
    $func = $bt[1]["function"];

    # session info also!!!
    $user = $_SESSION['user'];

    error_log('Died in ' . $file . ': ' . $line . ': function ' . $func .
            "(): user='{$user}': ip='{$_SERVER['REMOTE_ADDR']}': " . $msg .
            " (browser: '{$_SERVER['HTTP_USER_AGENT']})'");
    die($msg);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...