Забудьте о поздней статической привязке, мне нужна поздняя статическая __FILE__ - PullRequest
4 голосов
/ 27 апреля 2010

Я ищу 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, верно? Разве это не должно быть будущее?

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

Ответы [ 5 ]

5 голосов
/ 02 ноября 2011
3 голосов
/ 27 апреля 2010

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

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

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

1 голос
/ 27 апреля 2010

что делать, если вы не используете __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();

Вам все еще нужно повторно объявить свойство в каждом классе, но не метод

0 голосов
/ 30 января 2017

Протестировано:

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

Не работает.

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

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

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());
0 голосов
/ 17 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...