es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear una instancia de una clase a partir del retorno de un método y pasar datos al constructor en PHP.

Tengo clases de notificación llamadas ProductNotification, OrderNotification, etc., estas tienen un método llamado mail que devuelve otra clase que contiene más datos para el envío de correos electrónicos:

class ProductNotification {
    public function mail()
    {
        return ProductMail::class;
    }
}
class OrderNotification {
    public function mail()
    {
        return OrderMail::class;
    }
}

¿Hay alguna forma de instanciar la clase ProductMail desde el método? Lo siguiente no funciona y no estoy seguro de cómo pasar otra variable $data al constructor:

class BaseNotification {
    public function toMail()
    {
        return (new $this->mail())->to($email)->send();
    {
}

Sé que si mail fuera una propiedad de la clase en lugar de un método, esto sería posible y podría pasar $data al constructor, ya que lo siguiente funciona, pero ¿es posible desde un método?

class ProductNotification {
    public $mail = ProductMail::class;
}
class BaseNotification {
    public function toMail()
    {
        return (new $this->mail($data))->to($email)->send();
    {
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Como el método mail() está devolviendo el nombre de la clase como una cadena, puedes utilizar el operador new para instanciar la clase. Sin embargo, no puedes pasar un parámetro al constructor en la implementación actual.

    Para resolver esto, puedes modificar el método mail() para que acepte un parámetro y lo pase al constructor de la clase devuelta:

    class ProductNotification {
        public function mail($data)
        {
            return new ProductMail($data);
        }
    }
    
    class OrderNotification {
        public function mail($data)
        {
            return new OrderMail($data);
        }
    }
    

    Luego, puedes modificar el método toMail() en BaseNotification para pasar la variable $data al método mail():

    class BaseNotification {
        public function toMail($email, $data)
        {
            return ($this->mail($data))->to($email)->send();
        }
    }
    

    De esta manera, puedes instanciar la clase desde el método y pasar el parámetro $data al constructor.

Comments are closed.