Pagina 1 din 1

trimiterea mesajelor de la un obiect la altul

Scris: Joi Apr 20, 2017 11:21 pm
de stefanp
Salut,

Am codul de mai jos pentru care vreau sa trimit "mesaj" de la un obiect catre alt obiect care sa execute o functie.

1. Daca modific numele variabilei $_mesajWelcome in cele doua locuri din constructor am vazut ca functioneaza corect si as vrea sa stiu daca pentru interpretorul php conteaza ca obiectul care i-l dau, este de tipul
TrimitereMesajWelcome
si nu conteaza cum se numeste de fapt variabila.

2. am vazut un exemplu in care pe langa propriul obiect dat functiei de mai jos,

Cod: Selectaţi tot

   public function notifica()
    {
        $this->mesajWelcome->trimite($this); 
    }


mai pasa si un array gol

Cod: Selectaţi tot

   public function notifica()
    {
        $this->mesajWelcome->trimite([], $this); 
    }


iar pe langa parametrul functiei care primeste obiectul (function trimite($_student)) mai punea inca o variabila $var (function trimite($_student, $var) )care aceasta din urma apela functia public function trimitereReusita() din prima clasa.

$var->trimitereReusita(); in loc de $_student->trimitereReusita.


Va rog sa ma lamuriti cu situatia asta.


spor!





Cod: Selectaţi tot

class Student {
    public $nume;
    public $varsta;
    public $email;
   
    protected $mesajWelcome = "null";

    function __construct(TrimitereMesajWelcome $_mesajWelcome)
    {
            $this->mesajWelcome = $_mesajWelcome;
    }

    public function seteazaDate($_nume, $_varsta, $_email)
    {
        $this->nume = $_nume;
        $this->varsta = $_varsta;
        $this->email = $_email;
    }

    public function afiseazaDate()
    {
        echo "Numele : " . $this->nume . "<br>";
        echo "Varsta : " . $this->varsta . "<br>";
        echo "Email: " . $this->email . "<br>";
    }

    public function notifica()
    {
        $this->mesajWelcome->trimite($this);  // !!!  $this->mesajWelcome->trimite([], $this);
    }

    public function notificareReusita()
    {
        echo "Utilizatorul s-a notifica si prin functia asta am salvat in baza de date";
    }
}



class TrimitereMesajWelcome {
    protected $nume = "null";
    public $mesaj = "null";

    function trimite($_student)   // !!!    function trimite($_student, $var) 
    {
        $this->nume = $_student->nume;
        $this->mesaj = "Multumim pentru inscriere, " . $this->nume ." Contul tau a fost setat. In curand vei primi un email de notificare.";
        echo "S-a notificat utilizatorul cu mesajul: " . $this->mesaj . "<br><br><br>";

        var_dump($_student);
        $_student->notificareReusita(); // !!! $var->notificareReusita();
       
    }
}

$_mesajWelcome = new TrimitereMesajWelcome;


$_student = new Student($_mesajWelcome);
$_student->seteazaDate('Stefan', '34', 'adresa@email.ro');

$_student->afiseazaDate();
$_student->notifica();

Re: trimiterea mesajelor de la un obiect la altul

Scris: Vin Apr 21, 2017 5:23 pm
de nevvermind
Nu prea inteleg eu care-i problema pe-acolo, dar vezi poate asta iti clarifica niste dileme: https://pastebin.com/dArAEuK1

Fa-ti colaborarile intre obiecte sa fie simple. E cam incetzosat pe-acolo. Trimiti prea multe lucruri inainte si inapoi.

In primul rand, clasa Student n-ar trebui sa stie de existenta vreunei clase care trimite mail-uri/mesaje.

PS: Proprietatile sunt null in mod implicit, daca nu le dai valoare. Dar $prop = "null" nu-i acelasi lucru cu $prop = null, da?

Re: trimiterea mesajelor de la un obiect la altul

Scris: Sâm Apr 22, 2017 6:12 pm
de stefanp
Salut si multumesc pt raspuns,

Multe-s incetosate la inceput :)

M-a mai lamurit exemplul tau dar ca sa intelegi mai bine care este nelamurirea mea, gasesti aici -> https://pastebin.com/aj0SyBFb codul dupa care am incercat sa reproduc exemplul meu.

Vei gasi ca in functia de mai jos, paseaza 2 parametrii celui de-al doilea obiect, un array si propriul obiect iar in cel de-al doilea obiect, primeste array-ul si acea variabila $listener care cred ca este primul obiect. Apoi, al doilea obiect ar trebui sa vada daca userul ajunge sa fie inregistrat (lipseste logica) ca mai apoi sa trimita catre primul userRegisterFailed() (ca in exemplul nostru) sau userRegisterSuccesfful()

Daca ai putea sa imi explici care e treaba si sa imi transpui in exemplul cu clasa noastra Student, sunt bun de cinste :D


ms!

Cod: Selectaţi tot

public function register()
    {
        $this->registration->execute([], $this);
    }

Re: trimiterea mesajelor de la un obiect la altul

Scris: Dum Apr 23, 2017 12:26 am
de nevvermind
Nu inteleg ce problema ai. Care-i intrebarea de fapt? Ce sa pui in array-ul ala? De ce e gol? Imi imaginez ca ala-i pt a pasa informatii aditionale. Adica, cum iti dai seama daca s-a autentificat sau nu? Imi imaginez ca pasezi un flag in array-ul ala, precum

Cod: Selectaţi tot

$this->registration->execute(['is_success' => $authIsOk], $this);

Apoi

Cod: Selectaţi tot

public function execute(array $data, RespondsToUserRegistration $listener)
{
    var_dump('registering the user');

    if ($data['is_success']) {
        $listener->userRegisteredSuccesfull();
    } else {
        $listener->userRegisteredFailed();
    }
   
}


PS: Faci o zacusca din OOP-ul ala. Foloseste un sistem de events/observer in PHP si scapi de toate alea.
PPS: successful. Un singur "l". Doi de "s".