Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!
Kategorie

Kategorie

Kategoria wyżej
Spis treści

Spis treści

O autorze

O autorze

Witold (Dravo) Wasilewski
Reklama

Reklama

Singleton

Najprostsza droga do zrozumienia tego wzorca wiedzie przez przykład. Jednak najpierw musimy przezwyciężyć mały problem - brak statycznych zmiennych klasy w PHP4 (w PHP5 ta funkcji jest już dostępna - tłumacz). Dobrą nowiną jest natomiast to, że funkcje mogą mieć zmienne statyczne:

// Funkcja tworząca i pobierająca statyczne obiekty
function staticInstance($class) { 
    // Zadeklarowanie statycznej zmiennej do trzymania instancji obiektu
    static $instance; 

    // Jeśli instancja nie istnieje - stwórz ją
    if(!isset($instance)) { 
        $instance =& new $class; 
    } 
    return($instance); 
}

Teraz możemy wywołać funkcję gdziekolwiek chcemy (przyjmując że została dołączona) i pobrać statyczną instancję każdej klasy.

Notka: Zobacz również Statyczne zmienne klasy.

Teraz gdy przezwyciężyliśmy problem, zacznijmy stosować Singleton.W PHP and DOM: The Way of the Widget możemy zobaczyć budowę XHTMLowych `widgetów` przy użyciu rozszerzenia DOM. Podczas czytania mogłeś zauważyć, że w artykule przekazujemy każdy widget instancji API DOMu, która jest konstruowana gdzie indziej - może być to nieporęczne.Tak więc, DOM staje się pierwszym kandydatem dla zastosowania Singletona. Przyjrzyj się takiej funkcji:

// Funkcja tworząca statyczną instancje API DOMu     
function staticDom($type=null,$source=null) {
    // Deklaracja statycznej zmiennej trzymającej obiekt DOMu
    static $dom; 

    // Jeśli instancja nie istnieje - stwórz ją
    if(!isset($dom)) { 
        // Sprawdź na jakie sposoby DOM może zostać stworzony
        switch ( $type ) {
            case "file":
                $dom=domxml_open_file($source); // $source: ścieżka do pliku
                break;
            case "mem":
                $dom=domxml_open_mem($source); // $source: XML jako ciąg
                break;
            default:
                $dom=domxml_new_doc('1.0'); // tworzy nowy
                break;
        }
    }
    return($dom); 
}

OK - teraz przepiszmy klasę LinkWidget z artykułu PHP and DOM, tym razem już lepiej zaprojektowaną:

<?php
/**
 *  Tworzy tag linku XHTML
 */
class LinkWidget {
    /**
    * Prywatna
    * $dom instancja DOM API
    */
    var $dom;

    /**
    * Prywatna
    * $out czy zwraca obiekt DOM czy ciąg XML
    */
    var $out;

    /**
    * Prywatna
    * $link Obiekt linku XMLct
    */
    var $link;

    //! Konstruktor
    /**
    * Tworzy nowy obiekt LinkWidget
    * @param $out Przełącz pomiędzy ciągiem XML i obiektem DOM
    */
    function LinkWidget ($out='string') {
        $this->dom=& staticDom(); // Tworzy DOM ze statycznej zmiennej
        $this->out=$out;
        $this->createLink();
    }
    
    //! Accessor*
    /**
    * Tworzy &lt;a /&gt;
    * @return void 
    */
    function createLink () {
        $this->link=$this->dom->create_element('a');
    }

    //! Accessor*
    /**
    * Dodaje atrybut XML, np. href="http://www.php.net"
    * @return void 
    */
    function addAttribute($name,$value) {
        $this->link->set_attribute($name,$value);
    }

    //! Accessor*
    /**
    * Tworzy tekst dla linku
    * @return void 
    */
    function addText($text) {
        $text=$this->dom->create_text_node($text);
        $this->link->append_child($text);
    }

    //! Accessor*
    /**
    * Zwracam każdy XML jako ciąg lub objekt XML
    * @return mixed
    */
    function &fetch () {
        if ( $this->out=='string') {
            return $this->dom->dump_node ($this->link);
        } else {
            return $this->link;
        }
    }
}
?>

*Od tłumacz "Accessor" - są to funkcje tworzące API.

Zauważyłeś tę linijkę z konstruktorem?

$this->dom=& staticDom(); // Tworzy DOM ze statycznej instancji

Aby zobaczyć nasz kod w akcji, przygotujmy dwa sposoby wywołania klasy LinkWidget:

<?php
require_once('lib/static.php');
require_once('lib/LinkWidget.php');

$lw=new LinkWidget();
$lw->addAttribute('href','http://www.php.net');
$lw->addAttribute('style','{background-color: yellow; color: navy}');
$lw->addText('Powered by PHP');
echo ($lw->fetch());
?>

W powyższym kodzie klasa LinkWidget powoduje stworzenie obiektu DOM - przez co nie odwołujemy się do tego obiektu w naszym skrypcie.

Wynik?

<a href="http://www.php.net" style="{background-color: yellow; color: navy}">Powered by PHP</a>

Teraz rzućmy okiem na to:

<?php
require_once('lib/static.php');
require_once('lib/LinkWidget.php');

$dom=& staticDom();

$lw=new LinkWidget('DOM object');
$lw->addAttribute('href','http://www.php.net');
$lw->addAttribute('style','{background-color: yellow; color: navy}');
$lw->addText('Powered by PHP');
$dom->append_child($lw->fetch());
echo ($dom->dump_mem());
?>

Powtarzam - używaj z ostrożnością...

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (0)
Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2017 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System