2011-12-16 23 views
5

Me gustaría obtener los nombres de todas las clases dentro de un espacio de nombre específico en PHP. Actualmente, estoy intentando hacer algo de magia a través de la reflexión en una lista específica de clases con nombre, pero me gustaría hacerlo sin saber los nombres antes de tiempo.En PHP, ¿hay alguna manera de obtener todas las clases declaradas en un espacio de nombre específico?

He intentado llamar al get_declared_classes(), pero por alguna razón, las clases que tengo disponibles no se muestran. Puedo llamar al get_declared_classes(), no ver Event en la lista, luego llamar inmediatamente al $x = new Event() sin ningún problema. Algo como el siguiente, que creo que debería causar un problema ...

if (! in_array('Event', get_declared_classes())) { $x = new Event(); } 

... funciona bien. Me pregunto si el espacio de nombres de estas clases y la recuperación de esa manera ayudaría a aliviar el problema. es posible?

EDITAR: Para aclarar, permítanme agregar que actualmente no estoy usando espacios de nombres, y no estoy tratando específicamente de lograr algo del código mencionado anteriormente. Lo que quiero es obtener los nombres de todas las clases que he declarado. A pesar de que las declaraciones de clase de todos ellos están siendo afectadas antes de llamar al get_declared_classes(), no todas aparecen en la lista. Esperaba que el espacio de nombres pudiera ayudar a resolver el problema.

EDIT2: Varias personas han señalado que las clases pueden cargarse automáticamente. Probé esto haciendo lo siguiente. echo(class_exists('Event')) devolvió un valor de 1. echo(class_exists('Event', FALSE)) devolvió un valor de 0. El segundo parámetro opcional para class_exists es si se carga automáticamente o no. Entonces, aparentemente la clase está siendo cargada automáticamente. Eso responde eso.

Entonces, la próxima pregunta: ¿cómo puedo evitar esto? Estoy usando un framework que realmente no me da mucho control de bajo nivel. ¿Hay alguna manera de forzar la carga automática, ENTONCES llame al get_declared_classes, o get_declared_classes para disparar primero una carga automática?

+1

En este escenario en el que get_declared_classes no contiene eventos, ¿se ha cargado el código de evento? En otras palabras, ¿se ha incluido el archivo que contiene la declaración de clase del evento (o se ha definido de alguna otra manera en el flujo de código)? – Corbin

+1

No me he molestado en probar, pero creo que esto podría deberse a que has hecho referencia a un NS con una sentencia de uso y el nombre de clase en el conjunto va a ser el totalmente calificado con el espacio de nombres. De modo que, si bien 'new Event' podría funcionar, realmente hace referencia a' \ Some \ OtherNamespace \ Event'. – prodigitalson

+0

@Corbin El código del evento definitivamente está cargado. Si no, '$ x = new Event()' fallaría, ¿verdad? – rybosome

Respuesta

5

No es necesario para codificar en el código, se puede utilizar el nombre de variable:

$class_name = 'Event'; 
if (!in_array($class_name, get_declared_classes())) { 
    $x = new $class_name(); 
}; 

Ver código similar en acción aquí: codepad.org/hCLE4ToA.

También es posible que algunas clases no aparezcan en el resultado get_declared_classes(), porque es posible que no se carguen en el momento en que se llama a esta función. Puede ser el caso si están autocargadas después de intentar crear una instancia de ellas. Consulte más sobre clases de carga automática aquí: php.net/autoload.

¿Responde a algunas de sus preguntas? ¿Ayudó?

+0

No estoy tratando de hacer el ejemplo que mencioné.Eso fue más demostrativo de cómo el nombre de clase que quiero no aparece en la lista como era de esperar, sin embargo, está disponible para la creación de instancias. – rybosome

+1

@Ryan: ¿Estás seguro de que está disponible para la creación de instancias, no porque está autocargado cuando tratas de crear una instancia? En otras palabras: ¿está seguro de que la clase se ha definido antes de llamar a 'get_declared_classes()'? – Tadeck

+0

Estabas en lo cierto, la autocarga fue la culpable. – rybosome

Cuestiones relacionadas