trimiterea mesajelor de la un obiect la altul

PEAR, Smarty, ADOdb, OOP, PHP 5, XML, UML, Şabloane de proiectare, PHP-GTK.

Moderatori: coditza, Emil, Moderatori

stefanp
New Member
Mesaje: 2
Membru din: Joi Apr 20, 2017 10:48 pm

trimiterea mesajelor de la un obiect la altul

Mesajde stefanp » Joi Apr 20, 2017 11:21 pm

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();



nevvermind
Senior Member
Mesaje: 1201
Membru din: Mar Iun 22, 2010 3:17 pm

Re: trimiterea mesajelor de la un obiect la altul

Mesajde nevvermind » Vin Apr 21, 2017 5:23 pm

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?
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

stefanp
New Member
Mesaje: 2
Membru din: Joi Apr 20, 2017 10:48 pm

Re: trimiterea mesajelor de la un obiect la altul

Mesajde stefanp » Sâm Apr 22, 2017 6:12 pm

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);
    }

nevvermind
Senior Member
Mesaje: 1201
Membru din: Mar Iun 22, 2010 3:17 pm

Re: trimiterea mesajelor de la un obiect la altul

Mesajde nevvermind » Dum Apr 23, 2017 12:26 am

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".
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/


Înapoi la “PHP Avansat”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 1 vizitator