sé que esta pregunta ya tiene una respuesta, pero quería brindar una solución más realista a lo que creo que es su problema. Si hubiera tenido más tiempo ayer cuando hice mi comentario, habría publicado esto. Perdón por no haberlo hecho
Parece que OP tiene un sistema de módulo que necesita saber si un módulo en particular está cargado antes de permitir una llamada.
En primer lugar, me gustaría decir que el uso de espacios de nombres simplemente para declarar módulos activos es, IMO, abusar de lo que son. Si sigue el objetivo del espacio de nombres al pie de la letra, su estructura puede parecerse más a esto:
Todo su sistema debe estar en su propio espacio de nombres. Llamemos a ese espacio de nombres System
. Entonces, los módulos probablemente estarían debajo del espacio de nombre System\Module
. Luego, dependiendo de la complejidad, es posible que cada módulo tenga un espacio de nombres bajo System\Module
. Tomando sus ejemplos, System\Module\FOO
y System\Module\BAR
.
Ahora, entremos en un sistema de módulo que se registre en carga.
Primero, necesitamos un lugar para registrarse. Llamemos a eso System\Module\Registry
y, dado que es probable que haya muchos registros diferentes, implementará el System\iRegistry
.Para abreviar, solo estoy publicando System\Module\Registry
. Con toda probabilidad, también implementará algún tipo de modelo de coherencia global, como un singleton, pero tampoco lo estoy mostrando. Aquí está:
<?php
namespace System\Module
{
class Registry extends System\Registry
{
protected $registered = array();
public function register($name=null)
{
$this->registered[] = $name;
}
public function isRegistered($module)
{
// Code to find module
}
public function getModule($module)
{
// Code to find module
// OR, if you can't find it...
throw new ModuleNotRegisteredException("Module named \"{$module}\" could not be found in the registry.");
}
}
}
?>
Ahora, en cada módulo debe llamar a esta función de registro cuando se carga el archivo. Hay un par de maneras de hacer esto. La primera es tener algo de código en el espacio de nombres del módulo que se ejecuta en carga similar al código proceedural típica:
namespace System\Module\FOO
{
// Load this module
$system->module->register("FOO");
}
Lo anterior significaría la duplicación de código sin embargo. También puede usar autocarga para esto, de esa manera el código de "registro" está en un solo lugar. Aquí hay un concepto muy básico de hacer eso:
spl_autoload_register(
function ($className)
{
// Code to load files.
// Once loaded register our modules.
if($namespace = "System\\Module")
{
$system->module->register($classname);
}
}
);
Otra posible forma de hacer esto sería definir una interfaz para módulos con una función específica para el registro cuando se inicializa el módulo. Esto, sin embargo, significa que el módulo debe cargarse primero y puede causar sus propios problemas según sus necesidades.
Después de hacer esto:
- tiene un espacio de nombres coherentes para los módulos a vivir en
- tiene una interfaz consistente que permite a cualquier módulo de saber cómo registrar en sí
- se puede ampliar fácilmente la Módulo o interfaces de registro en el futuro para cosas nuevas, mientras mantiene su código limpio y fácil de entender.
- y, lo más importante es, sabrá que sus módulos realmente declararán que están cargados y/o listos en lugar de depender de la magia negra para hacerlo por usted.
En resumen, la respuesta es no. No hay forma de php de hacer esto. Quédate con class_exists o is_callable. –
@Kevin Peno, odio decirlo, pero como puede ver a continuación hay una manera de obtener el espacio de nombres cargado. – DonSeba
Disculpe, pero estaba hablando directamente en PHP. Como en, una función para verificar si un espacio de nombres está declarado/en uso. Lo siento si no fui lo suficientemente claro. –