Encontrar o arquivo PHP (em tempo de execução) onde uma classe foi definida

111

Existe alguma reflexão / introspecção / mágica no PHP que permitirá que você encontre o arquivo PHP onde uma determinada classe (ou função) foi definida?

Em outras palavras, tenho o nome de uma classe PHP ou um objeto instanciado. Quero passar isso para algo (função, classe de reflexão, etc.) que retorne o caminho do sistema de arquivos onde a classe foi definida.

/path/to/class/definition.php

Percebi que poderia usar ( get_included_files())para obter uma lista de todos os arquivos que foram incluídos até agora e, em seguida, analisá-los todos manualmente, mas isso é muito acesso ao sistema de arquivos para uma única tentativa.

Também percebi que poderia escrever algum código adicional em nosso mecanismo __autoload que armazena essas informações em algum lugar. No entanto, modificar o __autoload existente está fora dos limites na situação que tenho em mente.

Ouvir sobre extensões que podem fazer isso seria interessante, mas, no final das contas, gostaria de algo que pudesse ser executado em uma instalação de "estoque".

Alan Storm
fonte
2
Magento me trouxe aqui: -]
Alan
@alan bom ver algum nome de propriedade escrito lá.
Alan Storm,

Respostas:

225

Experimentar ReflectionClass

Exemplo:

class Foo {}
$reflector = new \ReflectionClass('Foo');
echo $reflector->getFileName();

Isso retornará falsequando o nome do arquivo não puder ser encontrado, por exemplo, em classes nativas.

Gordon
fonte
10

Para ReflectionClass em um arquivo com namespace , adicione um prefixo "\" para torná-lo global da seguinte maneira:

$ reflector = new \ ReflectionClass ('FOO');

Ou então, irá gerar um erro chamado ReflectionClass em um namespace não definido. Eu não tinha o direito de comentar a resposta acima, então escrevo isso como uma resposta complementar.

Jevin
fonte
0

se você tivesse uma pasta includes, você poderia executar um comando shell script para "grep" para "class $ className" fazendo: $filename = ``grep -r "class $className" $includesFolder/*\e ele retornaria o arquivo em que estava. Fora isso, não acho que haja mágica função do PHP para fazer isso por você.

Seaux
fonte
3
Curiosidade honesta, não idiota aqui. O que o fez pensar que essa resposta era melhor do que a ideia que eu já havia considerado e rejeitado? "Percebi que poderia usar (get_included_files ()) para obter uma lista de todos os arquivos que foram incluídos até agora e, em seguida, analisá-los todos manualmente, mas isso é muito acesso ao sistema de arquivos para uma única tentativa."
Alan Storm de
porque é uma linha em oposição a quantas linhas seriam necessárias para escrever um analisador em PHP e a função grep é compilada em C, eu acho, e provavelmente muito mais rápida do que qualquer coisa que teria sido escrita.
Seaux
Ah, entendi. Minha preocupação real era o acesso repetido ao disco para cada um dos arquivos repetidamente para fazer isso (é algo que acontecerá muito na ferramenta que estou construindo) e não a quantidade de código que tentarei tornar isso mais claro a seguir Tempo. (Para sua informação: você deve pesquisar ack. É muito melhor do que grep!)
Alan Storm
ack ou awk? Eu amo o awk, na verdade é minha linguagem de programação favorita, mas mais pessoas usam o grep regularmente ... é "mais limpo" para coisas tão simples
Seaux
Não awk, ack: betterthangrep.com É um substituto para perl back grep que é otimizado para projetos baseados em código de pesquisa. É ótimo.
Alan Storm,