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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top