elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  [Resuelto] Obtener dentro de función referencia a llamante
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Resuelto] Obtener dentro de función referencia a llamante  (Leído 2,295 veces)
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
[Resuelto] Obtener dentro de función referencia a llamante
« en: 20 Enero 2015, 17:09 pm »

Supongamos que tengo una interface:

Código
  1. <?php
  2.  
  3. interface ActiveRecord
  4. {
  5. public function save();
  6. public function update();
  7. public function delete();
  8. public function find($id);
  9. public function all();
  10. }

Y una clase que lo implementa:

Código
  1. <?php
  2.  
  3. abstract class ActiveRecordImpl implements ActiveRecord
  4. {
  5.  
  6. public function save()
  7. {
  8.  
  9. }
  10.  
  11. public function update()
  12. {
  13.  
  14. }
  15.  
  16. public function delete()
  17. {
  18.  
  19. }
  20.  
  21. public function find($id)
  22. {
  23.  
  24. }
  25.  
  26. public function all()
  27. {
  28.  
  29. }
  30.  
  31. }
  32.  

Además dos clases: Customer y User (con sus __get y __set) que heredan de Active Record.

Bien, supongamos que el método save() de ActiveRecord necesita guardar un objeto en la BD de la siguiente manera:

Código
  1. <?php
  2.  
  3. public function save()
  4. {
  5. $caller = REFERENCIA_AL_OBJETO_LLAMANTE;
  6. $callerClass = get_class($caller); // 'Customer' o 'User'
  7.  
  8. // obtiene el servicio dinámicamente, de acuerdo al objeto llamante
  9. $service = ServiceFactory::create($callerClass);
  10.  
  11. // le envía el objeto llamante al servicio Customer para que
  12. // lo guarde en la BD
  13. $service->save($caller);
  14. }

El método save() obtiene una referencia al método que lo llamó (que puede ser un objeto tipo Customer o User), y obtiene la clase del objeto llamante para poder crear su servicio respectivo. Posteriormente, el servicio guarda el objeto por medio del método save()

La clase ServiceFactory solo crea y devuelve un servicio para el tipo de clase indicado:

Código
  1. <?php
  2.  
  3. public static function create($class)
  4. {
  5. switch ($class) {
  6. case 'Customer':
  7. return new CustomerService();
  8.  
  9. case 'User':
  10. return new UserService();
  11. }
  12. }
  13.  

Y los servicios de 'Customer' y 'User' hacen uso de sus DAOs respectivos:

Código
  1. <?php
  2.  
  3. class CustomerService
  4. {
  5. public function save(Customer $customer)
  6. {
  7. new CustomerDAO()->save($customer);
  8. }
  9. }

Código
  1. <?php
  2.  
  3. class UserService
  4. {
  5. public function create(User $user)
  6. {
  7. new UserDAO()->save($user);
  8. }
  9. }

Ahora, para guardar un objeto 'Customer' y 'User' se haría lo siguiente:

Código
  1. <?php
  2.  
  3. $customer = new Customer();
  4. $customer->username = $username;
  5. $customer->email = $email;
  6. $customer->password = $password;
  7. $customer->dni = $dni;
  8. $customer->address = $address;
  9.  
  10. $user = new User();
  11. $user->username = $username;
  12. $user->email = $email;
  13. $user->password = $password;

¿Es ésto posible? Si es es así, ¿cómo podría obtener la referencia del objeto llamante?


« Última modificación: 20 Enero 2015, 21:40 pm por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: Obtener dentro de función referencia a llamante
« Respuesta #1 en: 20 Enero 2015, 17:43 pm »

¿Estás pensando en $this?


En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Obtener dentro de función referencia a llamante
« Respuesta #2 en: 20 Enero 2015, 20:37 pm »

@MinusFour gracias por responder. Efectivamente, estaba pensando en eso pero no estaba seguro, ya que no sabía a ciencia cierta cómo funcionaba this en PHP, y si funciona igual que en Java.

Dado que funciona igual que en Java y como las entidades 'Customer' y 'User' heredan de ActiveRecord, un simple this hace referencia al objeto mismo, y éso era de lo que no estaba seguro.

Un saludo y gracias por terminarlo de aclarar. Si se pudiera dar reputación te las daría.
En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines