Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problema con gli osservatori

    Ho aperto questo script:

    http://www.html.it/articoli/observer-pattern-in-php-1/

    su NetBeans e mi da errore, il software dice che non sono stati implementati tutti i metodi di quell'interfaccia ed ha ragione dunque per risolvere aggiungo i metodi che mancano scrivendo dentro qualcosa ma il segno dell'errore rosso non se ne va.

    Irritato apro Dreamweaver e vedo che errori non me ne da eppure mi sembra che le classi che implementino un'interfaccia debbano ridefinire tutti i loro metodi quindi non segnalare nulla a rigore mi sembra sbagliato.

    Fortunatamente lo script funziona anche così.

    Altro suggerimento che mi da NetBeans è di definire le classi astratte. E' giusto il consiglio però non è quello che voglio fare.

    Cosa devo aggiungere per scrivere correttamente lo script volendo utilizzare l'interfaccia SplObserver?

    Più pratica in futuro...

  2. #2
    la mia è questa:

    Codice PHP:
    namespace app\abstracts;

    use 
    SplObserver;

    abstract class 
    observer implements SplObserver {

        abstract protected function 
    updateSplSubject $subject );

        public function 
    __constructSplSubject $subject ) {
            
    $subject->attach$this );
        }


    http://it1.php.net/manual/en/class.splobserver.php
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Se lo script funziona, allora Netbeans ti sta segnalando degli errori, ma degli warning, che è diverso.

  4. #4
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    Se lo script funziona, allora Netbeans ti sta segnalando degli errori, ma degli warning, che è diverso.
    Conosco i warning ma gli avvisi che leggo non lo sono. Prova ad incollare sul tuo NetBeans questo codice e capirai di che parlo:

    Codice PHP:
    /**
      la classe Observer implementa l’interfaccia SplObserver
      e introduce i due metodi che verranno invocati al momento
      della registrazione di una modifica di stato del subject
     */
    class Observer implements SplObserver {

        protected 
    $papero;

        public function 
    __construct($papero) {
            
    $this->papero $papero;
        }

    # il nome della classe viene concatenato al costruttore

        
    public function __toString() {
            return 
    "(" __CLASS__ ") " $this->papero;
        }

    # il metodo update() introduce i metodi richiamati
    # in seguito all’evento in cui è coinvolto il subject

        
    public function update(SplSubject $subject) {
            if (
    $subject->menoDiMille() == true) {
                echo 
    $this ": - Te li presto. <br />";
            }
            if (
    $subject->piuDiMille() == true) {
                echo 
    $this ": - Ma in due rate. <br />";
            }
        }

    }

    # il secondo observer viene definito all’interno di una
    # sottoclasse che estende la classe del primo observer

    class ObserverB extends Observer {

        public function 
    update(SplSubject $sub) {
            if (
    $sub->piuDiMille() == true) {
                echo 
    $this ": - Non ti do un centesimo. <br />";
            }
        }

    }

    /*
      la classe Subject implementa l’interfaccia SplSubject
     */

    class Subject implements SplSubject {

        private 
    $papero;
        private 
    $observers = array();
        private 
    $menodimille false;
        private 
    $piudimille false;

        public function 
    __construct($papero) {
            
    $this->papero $papero;
        }

        public function 
    __toString() {
            return 
    "(" __CLASS__ ") " $this->papero;
        }

    # il metodo attach() attribuisce gli observers al subject

        
    public function attach(SplObserver $obs) {
            
    $this->observers[] = $obs;
        }

    # il metodo detach() dissocia gli observers al subject

        
    public function detach(SplObserver $obs) {
            
    $this->observers array_diff($this->observers, array($obs));
        }

    # notify() segnala il verificarsi di un evento a carico del subject

        
    public function notify() {
            foreach (
    $this->observers as $observer) {
                
    $observer->update($this);
            }
        }

    # definizione dei valori di ritorno

        
    public function chiedePiuDiMille($val) {
            
    $this->piudimille $val;
            if (
    $val == true) {
                echo 
    $this ": - Mi servono 1.200 Dollari. <br />";
            }
            
    $this->notify();
        }

        public function 
    piuDiMille() {
            return 
    $this->piudimille;
        }

        public function 
    chiedeMenoDiMille($val) {
            
    $this->menodimille $val;
            if (
    $val == true) {
                echo 
    $this ": - Mi servono 500 Dollari. <br />";
            }
            
    $this->notify();
        }

        public function 
    menoDiMille() {
            return 
    $this->menodimille;
        }

    }

    /*
      Istanza delle classi e generazione degli oggetti
      associati a subject ed observers
     */
    $observer = new Observer("Paperoga");
    $observerB = new ObserverB("Paperone");
    $subject = new Subject("Paperino");
    # invocazione dei metodi
    $subject->attach($observer);
    $subject->attach($observerB);
    $subject->chiedeMenoDiMille(false);
    $subject->chiedeMenoDiMille(true);
    $subject->chiedePiuDiMille(true);
    $subject->detach($observerB);
    $subject->chiedePiuDiMille(true); 
    Più pratica in futuro...

  5. #5
    Quote Originariamente inviata da Al_katraz984 Visualizza il messaggio
    la mia è questa:

    Codice PHP:
    namespace app\abstracts;

    use 
    SplObserver;

    abstract class 
    observer implements SplObserver {

        abstract protected function 
    updateSplSubject $subject );

        public function 
    __constructSplSubject $subject ) {
            
    $subject->attach$this );
        }


    http://it1.php.net/manual/en/class.splobserver.php
    Se aggiungo
    use SplObserver;
    risolvo il problema. Se aggiungo anche:
    use SplObserver;
    ritorna il problema.

    Più pratica in futuro...

  6. #6
    A parte il fatto che questa interfaccia SplObserver è inutile infatti posso tranquillamente riscrivere lo script decidendo di non usarla però la curiosità di perché NetBeans consideri il codice errato anche implementando tutti i metodi di questa stessa interfaccia c'è.

    Mettere un namespace al file e "risolvere" é davvero strano, questo proprio non me lo spiego.
    Più pratica in futuro...

  7. #7
    forse devi scrivere

    Codice PHP:
    ... implements \SplObserver {

    Questa volta, più che un voto.. è favoreggiamento.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.