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 = 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:
<?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?
¿Estás pensando en $this?
@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.