26/02/2008, 05:16
|
| | Fecha de Ingreso: octubre-2004 Ubicación: Cork (Irlanda)
Mensajes: 161
Antigüedad: 20 años, 2 meses Puntos: 1 | |
__call solo funciona con clases instanciadas?? Buenos días a todos. Verán, tengo una clase A que me proporciona una serie de métodos, y una clase B que hace de enlace entre ésta y el resto. De esta manera, desde el resto de clases puedo acceder a los métodos de A a través de B. Lo hago de esta manera para evitar acceder a A directamente sino sólo a través de B, en la que uso el patrón de diseño Singleton. Como de B no permito que se puedan crear instancias accedo a su atributo que hace de unión con A a través de :: y para no repetir los métodos de A en B uso __call en éste, así con solo llamar a B con un método que éste no tenga, el método __call irá a buscarlo a A. Código PHP: <?php class A { public function A1($message){ echo "Estoy en A1: "; echo $message."\n"; } public function A2($message){ echo "Estoy en A2: "; echo $message."\n"; } } class B { private static $instance; private static $connection; public function __construct(){ $this->connection = new A(); } public static function __call($method,$args){ if (!isset(self::$instance)){ $c = __CLASS__; self::$instance = new $c; } self::$instance->connection->$method($args[0]); } } class C { public function C1(){ $b = new B(); $b->A1("hola"); //B::A1("hola"); } public function C2(){ $b = new B(); $b->A2("adios"); //B::A2("adios"); } } $test = new C(); $test->C1(); $test->C2(); ?> Pero parece ser que __call solamente funciona con métodos de clases instanciadas. En realidad lo que quiero hacer es lo siguiente, A es una libreria de abstracción a la Base de Datos, B una clase que proporciona una única a instancia a A (por lo del singleton) y cuando desde el resto quiero usar A hago esto: Código PHP: C::Connection()->A1(); C::Connection()->A2(); C::Connection()->A3();
Estando Connection() en lugar de __call(). Código PHP: public static function Connection(){ if (!isset(self::$instance)){ $c = __CLASS__; self::$instance = new $c; } return self::$instance->connection; }
Toda la historia que he contado arriba simplemente es para hacer las llamadas así: Código PHP: C::A1(); C::A2(); C::A3();
No sé si les habré mareado mucho, quizás no me haya explicado bien, o quizás sea más simple de lo que parece. En fin, si alguien puede echarme una mano muchas gracias ;) |