Retroceder   Foros del Web > Programación para sitios web > PHP > PHP orientado a objetos

Respuesta
 
Herramientas Desplegado
Antiguo 26-feb-2008, 04:16   #1 (permalink)
masterjail está en el buen camino
 
Fecha de Ingreso: octubre-2004
Ubicación: Meliana (Valencia)
Mensajes: 159
__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 {
  public function 
A1($message){
    echo 
"Estoy en A1: ";
    echo 
$message."\n";
  }
 
  public function 
A2($message){
    echo 
"Estoy en A2: ";
    echo 
$message."\n";
  }
}
 
class 
{
  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 
{
  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 ;)
masterjail está desconectado   Responder Citando
Antiguo 26-feb-2008, 06:31   #2 (permalink)
drbit no se puede cailificar en este momento
 
Fecha de Ingreso: mayo-2006
Mensajes: 120
Re: __call solo funciona con clases instanciadas??

No se puede. No sé si está en PHP 5.3, pero en PHP 6 está seguro.

Está reportado acá:

http://bugs.php.net/bug.php?id=26739

Saludos.
__________________
Manual XHTML
drbit está desconectado   Responder Citando
Antiguo 26-feb-2008, 07:18   #3 (permalink)
masterjail está en el buen camino
 
Fecha de Ingreso: octubre-2004
Ubicación: Meliana (Valencia)
Mensajes: 159
Re: __call solo funciona con clases instanciadas??

Vaya, gracias por responder ;)
masterjail está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 21:46.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93