downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

SplSubject::attach> <SplObserver::update
[edit] Last updated: Fri, 24 May 2013

view this page in

The SplSubject interface

(PHP 5 >= 5.1.0)

Introduction

The SplSubject interface is used alongside SplObserver to implement the Observer Design Pattern.

Interface synopsis

SplSubject {
/* Methods */
abstract public void attach ( SplObserver $observer )
abstract public void detach ( SplObserver $observer )
abstract public void notify ( void )
}

Table of Contents



add a note add a note User Contributed Notes SplSubject - [2 notes]
up
1
Anonymous
18 days ago
<?php
class Observable implements SplSubject
{
    private
$storage;

    function
__construct()
    {
       
$this->storage = new SplObjectStorage();
    }

    function
attach(SplObserver $observer)
    {
       
$this->storage->attach($observer);
    }

    function
detach(SplObserver $observer)
    {
       
$this->storage->detach($observer);
    }

    function
notify()
    {
        foreach (
$this->storage as $obj) {
           
$obj->update($this);
        }
    }
   
//...
}

abstract class
Observer implements SplObserver
{
    private
$observable;

    function
__construct(Observable $observable)
    {
       
$this->observable = $observable;
       
$observable->attach($this);
    }

    function
update(SplSubject $subject)
    {
        if (
$subject === $this->observable) {
           
$this->doUpdate($subject);
        }
    }

    abstract function
doUpdate(Observable $observable);
}

class
ConcreteObserver extends Observer
{
    function
doUpdate(Observable $observable)
    {
       
//...
   
}
}

$observable = new Observable();
new
ConcreteObserver($observable);
up
6
przemyslaw dot szpiler at gmail dot com
1 year ago
<?php

// Example implementation of Observer design pattern:

class MyObserver1 implements SplObserver {
    public function
update(SplSubject $subject) {
        echo
__CLASS__ . ' - ' . $subject->getName();
    }
}

class
MyObserver2 implements SplObserver {
    public function
update(SplSubject $subject) {
        echo
__CLASS__ . ' - ' . $subject->getName();
    }
}

class
MySubject implements SplSubject {
    private
$_observers;
    private
$_name;

    public function
__construct($name) {
       
$this->_observers = new SplObjectStorage();
       
$this->_name = $name;
    }

    public function
attach(SplObserver $observer) {
       
$this->_observers->attach($observer);
    }

    public function
detach(SplObserver $observer) {
       
$this->_observers->detach($observer);
    }

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

    public function
getName() {
        return
$this->_name;
    }
}

$observer1 = new MyObserver1();
$observer2 = new MyObserver2();

$subject = new MySubject("test");

$subject->attach($observer1);
$subject->attach($observer2);
$subject->notify();

/*
will output:

MyObserver1 - test
MyObserver2 - test
*/

$subject->detach($observer2);
$subject->notify();

/*
will output:

MyObserver1 - test
*/

?>

 
show source | credits | stats | sitemap | contact | advertising | mirror sites