[Resuelto] Obtener dentro de función referencia a llamante

Iniciado por Usuario Invitado, 20 Enero 2015, 17:09 PM

0 Miembros y 1 Visitante están viendo este tema.

Usuario Invitado

Supongamos que tengo una interface:

Código (php) [Seleccionar]
<?php

interface ActiveRecord
{
public function save();
public function update();
public function delete();
public function find($id);
public function all();
}


Y una clase que lo implementa:

Código (php) [Seleccionar]
<?php

abstract class ActiveRecordImpl implements ActiveRecord
{

public function save()
{

}

public function update()
{

}

public function delete()
{

}

public function find($id)
{

}

public function all()
{

}

}


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 (php-brief) [Seleccionar]
<?php

public function save()
{
$caller REFERENCIA_AL_OBJETO_LLAMANTE;
$callerClass get_class($caller); // 'Customer' o 'User'

// obtiene el servicio dinámicamente, de acuerdo al objeto llamante
$service ServiceFactory::create($callerClass);

// le envía el objeto llamante al servicio Customer para que
// lo guarde en la BD
$service->save($caller);
}


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 (php) [Seleccionar]
<?php

public static function create($class)
{
switch ($class) {
case 'Customer':
return new CustomerService();

case 'User':
return new UserService();
}
}


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

Código (php) [Seleccionar]
<?php

class CustomerService
{
public function save(Customer $customer)
{
new CustomerDAO()->save($customer);
}
}


Código (php) [Seleccionar]
<?php

class UserService
{
public function create(User $user)
{
new UserDAO()->save($user);
}
}


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

Código (php) [Seleccionar]
<?php

$customer 
= new Customer();
$customer->username $username;
$customer->email $email;
$customer->password $password;
$customer->dni $dni;
$customer->address $address;

$user = new User();
$user->username $username;
$user->email $email;
$user->password $password;


¿Es ésto posible? Si es es así, ¿cómo podría obtener la referencia del objeto llamante?
"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


Usuario Invitado

@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.
"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