Забудьте о поздней статической связке, мне нужен поздний статический __File__

StackOverflow https://stackoverflow.com/questions/2718820

Вопрос

Я ищу get_called_class() эквивалент для __FILE__ ... может быть что-то вроде get_included_file()?

У меня есть набор классов, которые хотели бы знать, в каком каталоге они существуют. Что-то вроде этого:

<?php

class A {

    protected $baseDir;

    public function __construct() {
        $this->baseDir = dirname(__FILE__);
    }

    public function getBaseDir() {
        return $this->baseDir;
    }
}

?>

А в каком-то другом файле, в какой-то другой папке ...

<?php

class B extends A {
    // ...
}

class C extends B {
    // ...
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();

// Annnd... all three return the same base directory.

?>

Теперь я мог бы сделать что-то гетто, как добавление $this->baseDir = dirname(__FILE__) К каждому удлинению класса, но это кажется немного ... гетто. В конце концов, мы говорим о PHP 5.3, верно? Разве это не должно быть будущим?

Есть ли другой способ получить путь к файлу, где был объявлен класс?

Это было полезно?

Решение

Что если вы не используете __FILE__ но отдельная переменная и установить переменную в __FILE__ в каждом классе

class A {

    protected static $baseDir;
    protected $filename = __FILE__; // put this in every file

    public function __construct() {

    }

    public function getBaseDir() {
        return dirname($this->filename) . '<br>'; // use $filename instead of __FILE__
    }   

}

require('bdir/b.php');
require('cdir/c.php');

class B extends A {
    protected $filename = __FILE__; // put this in every file
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();

Вы все еще должны решить свойство в каждом классе, но не метод

Другие советы

Вы пытались назначить его как статический член класса?

<?php
class Blah extends A {
    protected static $filename = __FILE__;
}

(Непроверенные, и статики плюс класс наследство становится очень веселым ...)

Вы могли бы использовать debug_backtrace (). Отказ Вы, вероятно, не хотите, хотя.

Испытано:

    protected static $filename = __FILE__; 
    static::$filename 

Не работает.

Похоже, что постоянная зарегистрирована, когда класс загружен, что не «поздно».

Не уверен, что это было возможно раньше, но то, что было лучше для меня сегодня, использует отражение:

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top