Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Usuario Invitado en 20 Enero 2015, 17:09 pm



Título: [Resuelto] Obtener dentro de función referencia a llamante
Publicado por: Usuario Invitado 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?


Título: Re: Obtener dentro de función referencia a llamante
Publicado por: MinusFour en 20 Enero 2015, 17:43 pm
¿Estás pensando en $this?


Título: Re: Obtener dentro de función referencia a llamante
Publicado por: Usuario Invitado 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.