Obtendo o nome do caminho de uma classe herdada no PHP
Pergunta
Estou tentando obter o nome de caminho absoluto de uma classe PHP que herda de uma superclasse. Parece que deve ser simples. Eu acho que o código abaixo explica o mais sucintamente possível:
// 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();
}
}
A razão pela qual não quero substituir getAbsolutePathname()
é que haverá muitas classes que estendem o AbstractFoo, em potencialmente muitos lugares diferentes no sistema de arquivos (o Foo é na verdade um módulo) e parece uma violação do seco.
Solução
Bem, você pode usar reflexão:
public function getAbsolutePathname() {
$reflector = new ReflectionObject($this);
return $reflector->getFilename();
}
Não tenho certeza se isso retornará o caminho completo, ou apenas o nome do arquivo, mas não vejo outros métodos relevantes, então experimente ...
Outras dicas
Até onde eu sei, não há uma solução alternativa para isso. As constantes mágicas __FILE__
e __DIR__
são interpretados durante a análise e não são dinâmicos.
O que eu costumo fazer é
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__;
}
Você poderia invadir algo com debug_backtrace
, mas isso ainda exige que você substitua explicitamente a função pai em cada sub -classe.
É muito mais fácil definir a função como return __FILE__;
em cada sub -classe. __FILE__
Sempre será substituído pelo nome do arquivo em que é encontrado, não há como fazê -lo fazer o contrário.