Como posso saber em qual arquivo e linha uma determinada função foi definida?
Como posso saber em qual arquivo e linha uma determinada função foi definida?
Respostas:
Você também pode fazer isso no próprio PHP:
$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
$reflFunc = new ReflectionMethod($this, 'method_name');
Se você usar um IDE como o Netbeans, poderá CTRL + Clique na função usar e ela o levará para onde está definida, assumindo que o arquivo está dentro da pasta do projeto que você definiu.
No entanto, não há código ou função para fazer isso.
Presumo que por "descrito" você quer dizer "definido". Para isso, você precisa idealmente de um IDE decente que possa fazer isso.
Aqui está uma função básica que irá escanear seus arquivos de projeto inteiros para uma string específica e dizer a você em qual arquivo ele está e em qual posição de caractere ele começa usando apenas php básico. Espero que isso ajude alguém ...
<?php
$find="somefunction()";
echo findString('./ProjectFolderOrPath/',$find);
function findString($path,$find){
$return='';
ob_start();
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if(is_dir($path.'/'.$file)){
$sub=findString($path.'/'.$file,$find);
if(isset($sub)){
echo $sub.PHP_EOL;
}
}else{
$ext=substr(strtolower($file),-3);
if($ext=='php'){
$filesource=file_get_contents($path.'/'.$file);
$pos = strpos($filesource, $find);
if ($pos === false) {
continue;
} else {
echo "The string '$find' was found in the file '$path/$file and exists at position $pos<br />";
}
}else{
continue;
}
}
}
}
closedir($handle);
}
$return = ob_get_contents();
ob_end_clean();
return $return;
}
?>
Gosto da solução de Tom, então pensei que poderia compartilhar um pouco mais de truques com ReflectionFunction (ele deve funcionar em todos os PHP 5):
one-liner para imprimir o nome do arquivo:
print (new ReflectionFunction("foo"))->getFileName();
Observe que ele não mostrará a localização das funções internas (como _ ), mas ainda pode imprimir a API para ele conforme abaixo.
para imprimir a definição e os parâmetros da função:
print new ReflectionFunction("foo");
Exemplo:
$ php -r 'print new ReflectionFunction("_");'
Function [ <internal:gettext> function _ ] {
- Parameters [1] {
Parameter #0 [ <required> $msgid ]
}
}
$reflFunc->isInternal() === TRUE
significa -> getFileName () e -> getStartLine () retornará FALSE.