Supongamos que tengo una interface:
<?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:
<?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:
<?php
public function save()
{
$caller = REFERENCIA_AL_OBJETO_LLAMANTE;
$callerClass = getClass($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:
<?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:
<?php
class CustomerService
{
public function save(Customer $customer)
{
new CustomerDAO()->save($customer);
}
}
<?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:
<?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?