Получение пути унаследованного класса в PHP

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

  •  26-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь получить абсолютный путь класса PHP, который наследует от суперкласса. Похоже, это должно быть просто. Я думаю, что код ниже объясняет его так же кратко:

// myapp/classes/foo/bar/AbstractFoo.php
class AbstractFoo {

    public function getAbsolutePathname() {
        // this always returns the pathname of AbstractFoo.php
        return __FILE__;
    }

}


// myapp/classes/Foo.php
class Foo extends AbstractFoo {

    public function test() {
        // this returns the pathname of AbstractFoo.php, when what I
        // want is the pathname of Foo.php - WITHOUT having to override
        // getAbsolutePathname()
        return $this->getAbsolutePathname();
    }

}

Причина, по которой я не хочу переопределять getAbsolutePathname() Составлено, будет много классов, которые расширяют абстрактные зерна, потенциально много разных мест на файловой системе (FOO на самом деле модуль), и кажется, что нарушение сухого.

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

Решение

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

public function getAbsolutePathname() {
    $reflector = new ReflectionObject($this);
    return $reflector->getFilename();
}

Я не уверен, что вернет полный путь или просто имя файла, но я не вижу никаких других соответствующих методов, поэтому попробуйте ...

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

Насколько я знаю, для этого нет чистого обходного пути. Волшебные константы __FILE__ а также __DIR__ интерпретируются во время анализа и не динамичны.

То, что я склонен делать, это

class AbstractFoo {

    protected $path = null;

    public function getAbsolutePathname() {

        if ($this->path == null) 
              die ("You forgot to define a path in ".get_class($this)); 

        return $this->path;
    }

}


class Foo extends AbstractFoo {

  protected $path = __DIR__;

}

Вы могли бы что-то взломать с debug_backtrace, но это все еще требует, чтобы вы явно переопределили родительскую функцию в каждом подразделении.

Гораздо легче определить функцию как return __FILE__; в каждом подраздельном классе. __FILE__ Всегда будет заменено имя файла, в котором он найден, нет способа сделать его иначе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top