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".


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.


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.


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ê.


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,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.