Test Foro de elhacker.net SMF 2.1

Programación => Desarrollo Web => 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 (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?
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.