2011-10-17 15 views
5

¿Hay alguna manera de verificar si existe clase dentro de un archivo sin incluir/requerir la clase?comprobar si existe clase dentro del archivo sin requerir/incluir

Algo así como: class_in_file($file);

Como ya he dicho, sé que esto se puede hacer con requiriendo/incluyendo la clase y luego mirando hacia arriba class_exists($class);, pero alguna otra manera?

+0

Bueno, no ... ya que las imágenes requieren que el archivo compruebe si la clase existe en ese archivo ... de lo contrario, ¿de qué otro modo podría saberlo? si tuviera un class_in_file aún necesitaría leer el archivo. – Flukey

+2

Ayudaría mucho a la gente si explica por qué cree que necesita esto. – CodeCaster

+0

@Jamie Creo que quiere decir 'include' y' require', que son diferentes de simplemente leer el archivo. – deceze

Respuesta

9
$tokens = token_get_all(file_get_contents('foo.php')); 

luego pasar por las fichas para ver si puede encontrar un cierto T_CLASS entrada.

http://www.php.net/manual/en/function.token-get-all.php
http://www.php.net/manual/en/tokens.php

+0

Me perdí esas funciones, son geniales. Gracias por la información – Eineki

+0

en cuanto al rendimiento, ¿cuál sería la diferencia al incluir/requerir el archivo? Creo que ambos métodos tienen que cargar todo el archivo. – olanod

+0

@Dann El rendimiento inteligente, incluido el archivo, sería mucho más rápido. Pero aparentemente el OP no quiere hacer eso. – deceze

0

PHP solo sabrá qué clases existen si ha cargado (analizado) los archivos en los que están definidos (suponiendo que no estén incorporados). Si tiene una estructura claramente definida (tal vez está utilizando la carga automática), posiblemente podría verificar que exista una clase simplemente verificando que exista el archivo que la define. p.ej. if (file_exists('<path to app>/lib/Myapp/Util/Http.php')) podría usarse como un control que la clase Myapp_Util_Http existe en los directorios de su aplicación. Sin embargo, no existe garantía de que la clase exista en ese archivo. Para eso, tiene que incluirlo/exigirlo, leerlo y analizarlo, o usar la carga automática e intentar usarlo.

2

Un archivo php es un archivo de texto, puede abrirlo y analizarlo para encontrar una declaración de clase .

No es un proceso simple, pero un buen analizador debería hacer que la tarea sea trivial.

Debes tachar las líneas comentadas, las cadenas que contienen una declaración de clase pueden desencadenar un falso positivo, los heredocs tienden a hacer las cosas más complejas. Las evaluaciones también deben tenerse en cuenta.

si tiene acceso a un intérprete de php de la línea de comando, entonces puede ver el modificador -w que elimina los comentarios y los espacios en blanco para que usted haga una buena parte de su trabajo.

1

La respuesta corta es no. Solo hay soluciones. Por ejemplo, se puede analizar el archivo usted mismo (tal vez usando token_get_all), o tal vez marcar el archivo de alguna manera con un comentario en la parte superior como

<?php 
/** #has_class(CLASSNAME) 
*/ 

y leer las primeras líneas en busca de esto con un preg_match.

Cuestiones relacionadas