SlideShare a Scribd company logo
1 of 33
Download to read offline
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TREŒCI
                                         PHP5. Profesjonalne
                                         tworzenie oprogramowania
           KATALOG KSI¥¯EK               Autor: Sebastian Bergmann
                                         T³umaczenie: Wojciech Moch
                      KATALOG ONLINE     ISBN: 83-246-0069-8
                                         Tytu³ orygina³u: Professionelle
       ZAMÓW DRUKOWANY KATALOG           Softwareentwicklung mit PHP 5
                                         Format: B5, stron: 208

              TWÓJ KOSZYK
                                         Kolejna wersja popularnego jêzyka PHP wnios³a zupe³nie now¹ jakoœæ do tworzenia
                    DODAJ DO KOSZYKA     aplikacji internetowych. PHP5 to w pe³ni obiektowe œrodowisko, pozwalaj¹ce na
                                         korzystanie z wszystkich nowoczesnych technologii sieciowych i budowanie wydajnych
                                         oraz, co najwa¿niejsze, bezpiecznych systemów. Przed twórcami aplikacji otwar³y siê
         CENNIK I INFORMACJE             bramy do protoko³u SOAP, us³ug sieciowych, ogromnych mo¿liwoœci jêzyka XML
                                         i znacznie wydajniejszych po³¹czeñ z bazami danych.
                   ZAMÓW INFORMACJE      Ksi¹¿ka „PHP5. Profesjonalne tworzenie oprogramowania” jest przeznaczona w³aœnie
                     O NOWOŒCIACH        dla takich programistów -- tych, którzy opanowali poprzednie wersje PHP i chc¹ poznaæ
                                         mo¿liwoœci, jakie oferuje jego najnowsze wcielenie. Przedstawia tajniki projektowania
                       ZAMÓW CENNIK      i programowania obiektowego, ze szczególnym uwzglêdnieniem stosowania wzorców
                                         projektowych i testowania za pomoc¹ biblioteki PHPUnit. Opisuje mo¿liwoœci
                                         zastosowania w aplikacjach PHP jêzyka XML, protoko³u SOAP i zaawansowanych
                 CZYTELNIA               technik operowania na bazach danych. Czytaj¹c j¹, poznasz równie¿ metody
                                         automatycznego dokumentowania kodu oraz modelowania aplikacji za pomoc¹
          FRAGMENTY KSI¥¯EK ONLINE       jêzyka UML i dostêpnych bezp³atnie narzêdzi ArgoUML i Poseidon for UML.
                                             • Klasy i obiekty
                                             • Serializacja obiektów
                                             • Mechanizmy dziedziczenia
                                             • Korzystanie z biblioteki PHPUnit do testowania aplikacji
                                             • Stosowanie wzorców projektowych
                                             • Wzorce konstrukcyjne i strukturalne oraz wzorce zachowañ
                                             • Obs³uga jêzyka XML w PHP5
                                             • Tworzenie us³ug sieciowych
                                             • Wykorzystywanie mo¿liwoœci rozszerzenia MySQL
                                             • Komunikacja z bazami danych za pomoc¹ Creole i Propel
Wydawnictwo Helion                           • Tworzenie dokumentacji kodu z wykorzystaniem narzêdzia phpDocumentator
ul. Chopina 6                                • Modelowanie aplikacji w jêzyku UML
44-100 Gliwice                                                    Wykorzystaj najnowsz¹ wersjê PHP5
tel. (32)230-98-63                                    do stworzenia szybkich i bezpiecznych aplikacji internetowych
e-mail: helion@helion.pl
Spis treści
                 O autorze .......................................................................................................................... 9
                 Słowo wstępne ............................................................................................................... 11
                 Wprowadzenie ................................................................................................................ 13

Część I          Programowanie zorientowane obiektowo ........................17
Rozdział 1. Podstawy ....................................................................................... 19
                 1.1.    Wprowadzenie ....................................................................................................... 19
                 1.2.    Motywacja ............................................................................................................. 19
                 1.3.    Klasy i obiekty ....................................................................................................... 21
                 1.4.    Polimorfizm ........................................................................................................... 25
                 1.5.    Referencje .............................................................................................................. 26
                 1.6.    Metody klasy, zmienne klasy i stałe klasy ............................................................. 29
                 1.7.    Konstruktory i destruktory ..................................................................................... 30
                 1.8.    Dziedziczenie ........................................................................................................ 32
                 1.9.    Klasy abstrakcyjne i interfejsy ............................................................................... 35
                1.10.    Obsługiwanie błędów z wykorzystaniem wyjątków .............................................. 38
                1.11.    Serializacja obiektów ............................................................................................. 43
                1.12.    Reflection API ....................................................................................................... 45
                1.13.    Migracja z PHP4 do PHP5 .................................................................................... 47
Rozdział 2. Metody przechwytujące .................................................................. 49
                  2.1.   Wprowadzenie ....................................................................................................... 49
                  2.2.   Funkcja __autoload() ............................................................................................. 50
                  2.3.   Metoda __get() ...................................................................................................... 51
                  2.4.   Metoda __set() ....................................................................................................... 51
                  2.5.   Metoda __call() ..................................................................................................... 53
                  2.6.   Metoda __toString() .............................................................................................. 55
Rozdział 3. Iteratory ......................................................................................... 57
                  3.1.   Wprowadzenie ....................................................................................................... 57
                  3.2.   Interfejsy iteratorów w PHP5 ................................................................................ 59
                  3.3.   Biblioteka standardowa PHP (SPL) ....................................................................... 62
                  3.4.   Interfejs ArrayAccess ............................................................................................ 65
Rozdział 4. Tworzenie aplikacji ukierunkowane na testowanie
            z wykorzystaniem biblioteki PHPUnit ............................................... 69
                  4.1. Wprowadzenie ....................................................................................................... 69
                  4.2. Przypadki testowe i zapewnienia ........................................................................... 72
                  4.3. Wykonywanie i ocenianie przypadków testowych ................................................... 75
6                                                                     PHP5. Profesjonalne tworzenie oprogramowania


                  4.4. Automatyczne generowanie klas przypadków testowych ...................................... 78
                  4.5. Analiza pokrycia kodu dla aplikacji PHP .............................................................. 80
                  4.6. TestDox ................................................................................................................. 81

Część II         Stosowanie wzorców projektowych w PHP .....................83
Rozdział 5. Wzorce konstrukcyjne ..................................................................... 85
                  5.1. Wprowadzenie ....................................................................................................... 85
                  5.2. Fabryka abstrakcyjna ............................................................................................. 85
                  5.3. Singleton ................................................................................................................ 88
Rozdział 6. Wzorce strukturalne ....................................................................... 91
                  6.1. Wprowadzenie ....................................................................................................... 91
                  6.2. Dekorator ............................................................................................................... 91
                  6.3. Pośrednik ............................................................................................................... 94
Rozdział 7. Wzorce zachowań ........................................................................... 97
                  7.1.   Wprowadzenie ....................................................................................................... 97
                  7.2.   Obserwator ............................................................................................................ 97
                  7.3.   Metoda szablonu .................................................................................................. 102
                  7.4.   Strategia ............................................................................................................... 105
                  7.5.   Iterator ................................................................................................................. 108

Część III Programowanie w PHP5 ...............................................109
Rozdział 8. Obsługa XML w PHP ..................................................................... 111
                  8.1.   Wprowadzenie ..................................................................................................... 111
                  8.2.   SimpleXML ......................................................................................................... 112
                  8.3.   Simple API for XML (SAX) ............................................................................... 117
                  8.4.   Document Object Model (DOM) ......................................................................... 120
                  8.5.   Transformacje XSL (XSLT) ................................................................................ 128
                  8.6.   Przenoszenie obiektów do sieci WWW
                         za pomocą biblioteki XML_Transformer ..................................................................132
Rozdział 9. Usługi WWW korzystające z SOAP ................................................. 141
                  9.1. Wprowadzenie ..................................................................................................... 141
                  9.2. Programowanie usług sieciowych......................................................................... 142
                  9.3. Stosowanie usługi WWW..................................................................................... 145
Rozdział 10. Rozszerzenie MySQLi .................................................................... 147
                 10.1. Wprowadzenie ..................................................................................................... 147
                 10.2. Obiektowe wykorzystanie rozszerzenia MySQLi ................................................ 147
                 10.3. Stosowanie wstępnie przygotowanych zapytań ................................................... 150
                 10.4. Proceduralne korzystanie z rozszerzenia MySQLi .............................................. 152

Część IV Zaawansowane programowanie baz danych .................153
Rozdział 11. Creole .......................................................................................... 155
                 11.1. Wprowadzenie ..................................................................................................... 155
                 11.2. Połączenie z bazą danych .................................................................................... 156
                 11.3. Wykonywanie zapytań SQL ................................................................................ 157
                 11.4. Metadane ............................................................................................................. 162
Spis treści                                                                                                                                   7


Rozdział 12. Propel .......................................................................................... 163
                 12.1. Wprowadzenie ..................................................................................................... 163
                 12.2. Określanie modelu danych za pomocą XML ....................................................... 164
                 12.3. Model obiektów i pamięć obiektów ..................................................................... 169
                 12.4. Szukanie obiektów w pamięci obiektów .............................................................. 172

Część V          Narzędzia do tworzenia projektów w PHP .....................175
Rozdział 13. Dokumentacja kodu ...................................................................... 177
                 13.1. Wprowadzenie ..................................................................................................... 177
                 13.2. phpDocumentator ................................................................................................ 177
                 13.3. Doxygen .............................................................................................................. 181
Rozdział 14. Modelowanie w językach UML i MDA ............................................ 185
                 14.1. Wprowadzenie ..................................................................................................... 185
                 14.2. Programy ArgoUML i Poseidon for UML .......................................................... 186
                 14.3. UML2PHP ........................................................................................................... 189

Dodatki ......................................................................................193
Dodatek A Instalowanie Apache 2.0, MySQL 4.1 i PHP 5.0 ............................. 195
Dodatek B Literatura ..................................................................................... 197
Dodatek C Słowniczek ................................................................................... 199
                 Skorowidz ..................................................................................... 201
Rozdział 8.
Obsługa XML w PHP
                                            „XML to gigantyczny krok naprzód,
                                                w zupełnie żadnym kierunku”.
                                                                 Eric Naggum



8.1. Wprowadzenie
W związku z cały czas rosnącą popularnością języka XML1 (eXtensible Markup
Language), w PHP5 wprowadzona została przygotowana od podstaw obsługa ję-
zyka XML. W PHP4 standardowa instalacja pakietu była już wyposażona w ste-
rowane zdarzeniami mechanizmy obsługi XML, bazujące na bibliotece Expat.
Z kolei w standardowej instalacji PHP5 udostępnione zostały znacznie bardziej
rozbudowane mechanizmy obsługi dokumentów XML, bazujące na bibliotekach
libxml2 i libxslt pochodzących z projektu GNOME.
       Rozszerzenie SimpleXML pozwala na bardzo prostą obsługę
       dokumentów XML.
       Rozszerzenie XML umożliwia obsługę dokumentów XML sterowaną
       zdarzeniami, zgodną z Simple Api for XML (SAX)2, i w związku z tym
       jest zgodne z opartą na bibliotece Expat obsługą dokumentów XML,
       stosowaną w PHP4.
       Rozszerzenie DOM implementuje standard DOM (Document Object
       Model)3, przez co pozwala na obiektową obsługę dokumentów XML
       reprezentowanych w postaci struktury drzewiastej.




1
    http://www.w3.org/XML/
2
    http://www.saxproject.org/
3
    http://www.w3.org/DOM/
112                                                      Część III ♦ Programowanie w PHP5


            Rozszerzenie XSLT udostępnia wszystkie funkcje konieczne
            do transformowania dokumentów zgodnie ze standardem XSL
            (eXtensible Stylesheet Language)4.



      8.2. SimpleXML
      Do prostej obsługi dokumentów XML PHP udostępnia interfejs programistyczny
      SimpleXML. Interfejs ten opiera się na idei pakietu języka Perl o nazwie XML:
      :Simple i w związku z tym pozwala na intuicyjny dostęp do danych zapisanych
      w dokumencie XML.


      8.2.1. Ładowanie i zapisywanie
             dokumentów XML
      Funkcje simplexml_load_file() i simplexml_load_string() tworzą obiekt klasy
      SimpleXMLElement przeznaczony do obsługi danych XML, które w zależności od
      użytej funkcji ładowane są ze wskazanego pliku lub ciągu znaków.

      Metoda asXML($filename) zwraca dane istniejącego obiektu SimpleXMLElement
      w formacie XML i może je ewentualnie zapisać do wskazanego pliku.


      8.2.2. Klasa SimpleXMLElement
      Obiekt klasy SimpleXMLElement (jej diagram UML przedstawiony został na ry-
      sunku 8.1) przechowuje po jednej zmiennej egzemplarza dla każdego podrzędnego
      elementu w strukturze XML. Każda taka zmienna otrzymuje nazwę opisującą
      dany element XML (proszę przyjrzeć się rysunkowi 8.2). Jeżeli dany element pod-
      rzędny występuje w strukturze tylko raz, to zmienna egzemplarza przechowuje
      wartość tego elementu. Jeżeli jednak dany element podrzędny występuje w struk-
      turze wielokrotnie (tak jak element <book> na listingu 8.1), to zmienna egzempla-
      rza przechowywać będzie tablicę5 obiektów SimpleXMLElement opisujących każdy
      z elementów podrzędnych.




      4
          http://www.w3.org/Style/XSL/
      5
          Funkcje tablicowe PHP nie będą jednak współpracowały z taką tablicą, a wywołanie
          is_array($books->book[1]->author) zwróci wartość FALSE. Mimo to zawarte w PHP
          funkcje debugowania print_r() i var_dump() będą traktować zapis $books->book[1]->
          author jako tablicę.
Rozdział 8. ♦ Obsługa XML w PHP                                               113

                                                                      Rysunek 8.1.
                                                                      Klasa
                                                                      Simple-
                                                                      XMLElement




                                                                      Rysunek 8.2.
                                                                      Reprezentacja
                                                                      plików XML
                                                                      w obiektach
                                                                      typu
                                                                      SimpleXML-
                                                                      Element




  <?xml version="1.0" encoding="iso-8859-2" ?>                        Listing 8.1.
  <!DOCTYPE books PUBLIC "books" "books.dtd">                         Katalog
                                                                      książek
  <books>                                                             w formacie
    <book lang="pl">                                                  XML
      <author>Sebastian Bergmann</author>
      <title>Profesjonalne tworzenie oprogramowania w PHP 5</title>
      <isbn>83-246-0069-8</isbn>
    </book>
114                                                             Część III ♦ Programowanie w PHP5


                     <book lang="de">
                       <author>Emilian Balanescu</author>
                       <author>Mihai Bucica</author>
                       <author>Cristian Darie</author>
                       <title>PHP5 i MySQL. Zastosowania e-commerce</title>
                       <isbn>83-7361-830-9</isbn>
                     </book>
                   </books>

                 Obiekt klasy SimpleXMLElement wyposażony jest w implementację metody prze-
                 chwytującej __toString (była o niej mowa w podrozdziale 2.6), dlatego możliwe
                 jest odczytanie tekstowej reprezentacji każdego elementu XML (CDATA), na przykład
                 za pośrednictwem instrukcji print. Na listingu 8.2 przedstawiony został sposób
                 odczytywania ze struktury XML zawartości elementu title z pierwszego ele-
                 mentu book.

 Listing 8.2.      <?php
      Dostęp       $books = simplexml_load_file('books.xml');
do elementu
        XML        print $books->book[0]->title;
 za pomocą         ?>
   interfejsu
 SimpleXML         Profesjonalne tworzenie oprogramowania w PHP 5

                 W obiektach SimpleXMLElement metoda attributes() zwraca tablicę asocjacyjną ze
                 wszystkimi atrybutami danego elementu XML. Przykład wykorzystania tej metody
                 przedstawiony został na listingu 8.3.

  Listing 8.3.     <?php
       Dostęp      $books = simplexml_load_file('books.xml');
do atrybutów
    elementu       foreach ($books->book[0]->attributes() as $nazwa=>$wartosc) {
XML poprzez           print "$nazwa: $wartoscn";
     interfejs     }
 SimpleXML
                   ?>
                   lang: pl

                 Klasa SimpleXMLElement implementuje również interfejs iteratora Traversable (oma-
                 wiany był w rozdziale 3.). Dzięki temu obiekt typu SimpleXMLElement może być
                 dowolnie iterowany za pomocą operatora foreach (i jednocześnie można obsługiwać
                 zawarte w nim dane dokumentu XML), tak jak na listingu 8.4.

  Listing 8.4.     <?php
       Dostęp      $books = simplexml_load_file('books.xml');
 do katalogu
      książek      foreach ($books->book as $ksiazka) {
  za pomocą          $autorzy = '';
    interfejsu
 SimpleXML
                     foreach ($ksiazka->author as $autor) {
  i operatora
      foreach          $autorzy .= empty($autorzy) ? $autor : ', ' . $autor;
                     }

                     printf(
                       "%s: "%s"nISBN: %snn",
Rozdział 8. ♦ Obsługa XML w PHP                                                            115


           $autorzy,
           $ksiazka->title,
           $ksiazka->isbn
         );
    }
    ?>
    Sebastian Bergmann: "Profesjonalne tworzenie oprogramowania w PHP 5"
    ISBN: 83-246-0069-8
    Emilian Balanescu, Mihai Bucica, Cristian Darie: "PHP5 i MySQL. Zastosowania
    e-commerce"
    ISBN: 83-7361-830-9

Zawartość obiektów SimpleXMLElement może zostać zmieniona przez odpowied-
nie modyfikacje odpowiednich zmiennych egzemplarza, tak jak na listingu 8.5.

    <?php                                                                          Listing 8.5.
    $books = simplexml_load_file('books.xml');                                     Zmiana
    $books->book[0]->author = 'Johannes Sebastian Bergmann';                       zawartości
                                                                                   obiektu
    print $books->book[0]->asXML();                                                Simple-
    ?>                                                                             XMLElement
                                                                                   i wypisanie
    <book lang="pl">                                                               danych XML
        <author>Johannes Sebastian Bergmann</author>
        <title>Profesjonalne tworzenie oprogramowania w PHP 5</title>
        <isbn>83-246-0069-8</isbn>
      </book>

Korzystając w obiekcie SimpleXMLElement z metody xpath(), można tworzyć za-        XPath
pytania w języku XML Path Language (XPath)6. Na listingu 8.6 zostało przed-
stawione zapytanie zwracające tytuły wszystkich książek zapisanych w katalogu.
Wynikiem takich zapytań jest zawsze tablica obiektów typu SimpleXMLElement.

    <?php                                                                          Listing 8.6.
    $books = simplexml_load_file('books.xml');                                     Zastosowanie
                                                                                   języka XPath
    foreach ($books->xpath('book/title') as $tytul) {                              w interfejsie
       print "$tytuln";                                                           SimpleXML
    }
    ?>
    Profesjonalne tworzenie oprogramowania w PHP 5
    PHP 5



8.2.3. Klasa SimpleXMLIterator
W bibliotece standardowej PHP (była o niej mowa w rozdziale 3.) dostępna jest
też pewna alternatywa dla klasy SimpleXMLElement, pozwalająca na obsługę do-
kumentów XML za pomocą interfejsu SimpleXML — klasa SimpleXMLIterator.



6
    http://www.w3.org/TR/xpath
116                                                            Część III ♦ Programowanie w PHP5


                Klasa SimpleXMLIterator udostępnia interfejs RecursiveIterator i dlatego może
                przeglądać wszystkie elementy dokumentu XML, korzystając przy tym z dodat-
                kowego iteratora typu RecursiveIteratorIterator.

                Na listingu 8.7 wywoływana jest funkcja simplexml_load_file(), której podawany
                jest opcjonalny drugi parametr, przez co w wyniku swojego działania funkcja ta,
                zamiast obiektu SimpleXMLElement, zwraca obiekt typu SimpleXMLIterator. Następ-
                nie tworzony jest obiekt typu RecursiveIteratorIterator obsługujący obiekt
                SimpleXMLIterator. Przy użyciu tego iteratora, w wyniku podania dodatkowego
                parametru RIT_SELF_FIRST, wypisywane są wszystkie elementy XML z elementem
                podstawowym (root) włącznie.
 Listing 8.7.     <?php
Rekursywne        $dokument = simplexml_load_file(
  wyliczanie         'books.xml',
 wszystkich          'SimpleXMLIterator'
 elementów        );
 dokumentu
        XML       $iterator = new RecursiveIteratorIterator(
                     $dokument,
                     RIT_SELF_FIRST
                  );

                  foreach($iterator as $nazwa => $element) {
                     print $nazwa . "n";
                  }
                  ?>
                  book
                  author
                  title
                  isbn
                  book
                  author
                  author
                  author
                  title
                  isbn

                Wewnątrz pętli foreach z listingu 8.7 zmienna $nazwa przechowuje nazwę aktu-
                alnego elementu XML, natomiast w zmiennej $element zapisywany jest obiekt
                opisujący ten element.


                8.2.4. Wady i zalety
                    Zaleta: Bardzo prosty dostęp do elementów XML.
                    Zaleta: Niewielkie zapotrzebowanie na pamięć, ponieważ obiekty PHP
                    tworzone są tylko w razie potrzeby, a sam dokument początkowo zapisany
                    jest tylko raz (w pamięci biblioteki libxml2).
                    Zaleta: Prędkość działania.
                    Wada: Utrudniony dostęp do atrybutów elementów XML.
                    Wada: Brak standardu.
Rozdział 8. ♦ Obsługa XML w PHP                                                                117



8.3. Simple API for XML (SAX)
W czasie obsługi danych XML za pomocą Simple API for XML (SAX) parser                  Orientacja
XML wywołuje określone zdarzenia (otwierający znacznik elementu, zamykający            na zdarzenia
znacznik elementu itp.), które muszą być obsłużone przez programistę w ramach
specjalnych metod lub funkcji.

Najpierw przyjrzymy się trzem najważniejszym zdarzeniom wykorzystywanym
w trakcie przetwarzania danych XML: „Start Element”, „End Element” i „Cha-
racter Data”.
     xml_set_element_handler($parser, <start_element_handler>,
     <end_element_handler>) — Rejestruje funkcje wywołań zwrotnych
     dla zdarzeń „Start Element” i „End Element”. Funkcja lub metoda
     obsługująca zdarzenie „Start Element” musi przyjmować trzy parametry:
     $parser, $name i $attributes. Ostatni z tych parametrów zawiera tablicę
     asocjacyjną z atrybutami elementu XML. Funkcja lub metoda obsługująca
     zdarzenie „End Element” musi przyjmować dwa parametry: $parser
     i $name.
     xml_set_character_data_handler($parser, <handler>) — Rejestruje
     funkcję wywołań zwrotnych dla zdarzenia „Character Data”. Funkcja
     lub metoda, która ma obsługiwać to zdarzenie, musi przyjmować dwa
     parametry: $paser i $cdata.

W czasie rejestrowania funkcji wywołania zwrotnego (ang. callback) w parametrze
<handler> można przekazać nazwę funkcji lub tablicy przechowującej referencję
obiektu, a także nazwę metody tego obiektu, która ma obsługiwać dane zdarzenie.

Na listingu 8.8 przedstawiony został sposób obsługi katalogu książek z listingu 8.1.

  <?php                                                                                Listing 8.8.
  class Ksiazki {                                                                      Dostęp
    protected $parser;                                                                 do katalogu
    protected $stosElementow = array();                                                książek
    protected $autorzy = array();                                                      poprzez
                                                                                       interfejs SAX
    public function __construct() {
      $this->parser = xml_parser_create();

       xml_set_object($this->parser, $this);

       xml_set_element_handler(
          $this->parser,
          'startElement',
          'endElement'
       );

       xml_set_character_data_handler(
          $this->parser,
          'characterData'
       );
118                                                     Część III ♦ Programowanie w PHP5


              xml_set_default_handler(
                 $this->parser,
                 'characterData'
              );
          }

          public function __destruct() {
            xml_parser_free($this->parser);
          }

          public function odczytajKatalog($katalog) {
            xml_parse(
               $this->parser,
               file_get_contents($katalog),
               TRUE
            );
          }

          protected function
          startElement($parser, $element, $attributes) {
            array_push($this->stosElementow, $element);

              if ($element == 'BOOK') {
                $this->autorzy = array();
              }
          }

          protected function endElement($parser, $element) {
            array_pop($this->stosElementow);
          }

          protected function characterData($parser, $cdata) {
            $poziom   = sizeof($this->stosElementow) - 1;
            $element = $this->stosElementow[$poziom];

              switch($element) {
                  case 'AUTHOR': {
                    $this->autorzy[] = $cdata;
                  }
                  break;

                  case 'TITLE': {
                    print implode(', ', $this->autorzy) . "n";
                    print $cdata . "n";
                  }
                  break;

                  case 'ISBN': {
                    print 'ISBN: ' . $cdata . "nn";
                  }
                  break;
              }
          }
      }
Rozdział 8. ♦ Obsługa XML w PHP                                                    119


  $ksiazki = new Ksiazki;
  $ksiazki->odczytajKatalog('books.xml');
  ?>
  Sebastian Bergmann
  Profesjonalne tworzenie oprogramowania w PHP5
  ISBN: 83-246-0069-8

  Emilian Balanescu, Mihai Bucica, Cristian Darie
  PHP5 i MySQL. Zastosowania e-commerce
  ISBN: 83-7361-830-9

Parser interfejsu SAX przetwarza dane dokumentu XML w sposób liniowy
i w pamięci przechowuje tylko te dane, które związane są z bieżącym zda-
rzeniem. Dlatego też programista musi się zajmować przechowywaniem danych
aktualnie obsługiwanego elementu XML. W naszym przykładzie nazwę otwiera-
nego właśnie znacznika XML zapisujemy na stosie. W metodzie obsługującej
zdarzenie „Character Data” można dzięki temu stwierdzić, z którym elementem
związane są aktualnie obsługiwane dane. W momencie gdy parser dotrze do za-
mykającego znacznika XML, nazwę elementu można usunąć ze stosu.

W interfejsie SAX obok zdarzeń „Start Element”, „End Element” i „Character Data”
udostępniane są jeszcze następujące zdarzenia:
    xml_set_processing_instruction_handler($parser, <handler>)
    — rejestruje funkcję wywołania zwrotnego obsługującą zdarzenie
    „Processing Instruction”.
    xml_set_external_entity_ref_handler($parser, <handler>) — rejestruje
    funkcję wywołania zwrotnego obsługującą zdarzenie „External Entity
    Reference”.
    xml_set_notation_decl_handler($parser, <handler>) — rejestruje
    funkcję wywołania zwrotnego obsługującą zdarzenie „Notation Declaration”.
    xml_set_unparsed_entity_decl_handler($parser, <handler>) — rejestruje
    funkcję wywołania zwrotnego obsługującą zdarzenie „Unparsed Entity
    Declaration”.
    xml_set_default_handler($parser, <handler>) — rejestruje funkcję
    wywołania zwrotnego obsługującą wszystkie te zdarzenia, dla których nie
    została zarejestrowana metoda obsługi.


8.3.1. Wady i zalety
    Zaleta: Standard, choć niezatwierdzony przez konsorcjum WWW.
    Zaleta: Niewielkie użycie pamięci, ponieważ w danym momencie
    dostępny jest tylko aktualny element XML.
    Zaleta: Szybkość działania.
120                                                            Część III ♦ Programowanie w PHP5


                       Wada: Praca liniowa, nie jest możliwy swobodny dostęp do elementów.
                       Wada: Nie ma możliwości zapisu danych.
                       Wada: Programista musi zajmować się wszystkimi szczegółami obsługi.



                 8.4. Document Object
                      Model (DOM)
                 Konsorcjum WWW (W3C)7 przygotowało bardzo potężny standard w postaci
                 modelu DOM (Document Object Model), stanowiącego niezależny od platformy
                 i języka programowania interfejs programistyczny przeznaczony do odczyty-
                 wania i zapisywania danych w prawidłowych dokumentach HTML i prawi-
                 dłowo zbudowanych dokumentach XML.

                 PHP5 udostępnia własne rozszerzenie obsługi modelu DOM, które niestety nie
                 jest zgodne z rozszerzeniem obsługi modelu DOM z PHP4. Rozszerzenie to jest
                 pełną implementacją standardu DOM w wersji „Level 2 Core”, a dodatkowo za-
                 wiera pewne elementy („Load and Save”) nowszej wersji „Level 3”.

       Węzły     Model DOM zajmuje się wszystkimi elementami dokumentu XML, które traktowa-
                 ne są jak węzły drzewa. Sam dokument (DOMDocument), jego elementy (DOMElements),
                 a także ich atrybuty (DOMAttr) oraz tekstowa zawartość (DOMText) reprezentowane
                 są przez obiekty odpowiednich klas węzłów, które powiązane są ze sobą za po-
                 mocą referencji. Na rysunku 8.3 przedstawione zostało drzewo obiektów DOM
                 utworzone na podstawie dokumentu XML prezentowanego na listingu 8.1.
 Rysunek 8.3.
Reprezentacja
     struktury
      katalogu
       książek
     w postaci
struktury DOM




                 7
                     http://www.w3.org/
Rozdział 8. ♦ Obsługa XML w PHP                                                                121


Implementacja modelu DOM w PHP5 obejmuje 29 klas w sumie zawierających
360 metod. W tym miejscu zajmiemy się najważniejszymi z nich (przedstawione
zostały w tabeli 8.1).

                                                                                        Tabela 8.1.
                     Klasa bazowa
 Klasa                                   Zadanie                                        Najważniejsze
                     lub interfejs                                                      klasy modelu
 DOMNode                                                                                DOM
                                         Klasa bazowa dla pozostałych klas węzłów
                                         drzewa DOM.
 DOMDocument         DOMNode             Stanowi punkt wejścia do drzewa DOM.
 DOMElement          DOMNode             Reprezentuje element XML i udostępnia
                                         metody dostępu do elementów XML.
 DOMAttr             DOMNode             Reprezentuje atrybut elementu XML.
 DOMCharacterData    DOMNode             Reprezentuje część danych tekstowych
                                         elementu XML.
 DOMText             DOMCharacterData    Reprezentuje tekstowe zawartości
                                         dokumentu XML.
 DOMNodeList         Traversable         Reprezentuje zbiór węzłów.
 DOMXPath                                Umożliwia formułowanie zapytań XPath.
 DOMException        Exception           Klasa wyjątku.



8.4.1. Ładowanie i zapisywanie
       dokumentów XML
Metoda DOMDocument::load($filename) przeznaczona jest do odczytywania do-
kumentu XML ze wskazanego pliku i może być wywoływana zarówno na rzecz
konkretnego obiektu, jak i statycznie na rzecz klasy. Jeżeli wywoływana jest statycz-
nie, to zwraca w wyniku swojego działania obiekt klasy DOMDocument (przykład
takiego działania znaleźć można na listingu 8.12). Z kolei metoda DOMDocument:
:loadXML($xml) pozwala na załadowanie dokumentu XML z ciągu znaków,
natomiast funkcja dom_import_simplexml($sxe) tworzy nowy obiekt klasy DOM-
Document na podstawie obiektu klasy SimpleXMLElement.

Podobnie metody DOMDocument::loadHTMLFile($filename) i DOMDocument::loadHTML
($html) pozwalają na załadowanie dokumentu HTML z pliku lub ciągu znaków.

Metody DOMDocument::save($filename) i DOMDocument::saveXML() przeznaczone
są do zapisywania dokumentu XML we wskazanym pliku lub ciągu znaków. Do
obsługi zapisu dokumentów HTML przygotowane zostały metody DOMDocument:
:saveHTMLFile($filename) i DOMDocument::saveHTML().

Wszystkie wymienione metody wykorzystują system strumieni funkcjonujący                 Strumienie
w PHP5. Tym samym w zależności od tego, która wersja obsługi strumieni zo-
stanie wkompilowana do projektu, metody te mogą na przykład otworzyć plik XML
122                                                            Część III ♦ Programowanie w PHP5


                ze zdalnego serwera albo zapisać dokument XML na serwerze FTP. W takich
                przypadkach zamiast nazwy pliku w parametrze $filename należy podać od-
                powiedni adres URL.


                8.4.2. Tworzenie nowego dokumentu XML
                Na listingu 8.9 najpierw tworzony jest obiekt klasy DOMDocument. Konstruktorowi
                tej klasy przekazywana jest żądana wersja standardu XML ("1.0") oraz stosowa-
                ne w dokumencie kodowanie znaków ("iso-8859-2").

 Listing 8.9.     <?php
  Tworzenie       $dokument = new DOMDocument('1.0', 'iso-8859-2');
    nowego        $dokument->formatOutput = TRUE;
 dokumentu
        XML       $ksiazki = $dokument->appendChild(
                     $dokument->createElement('books')
                  );

                  $ptop5 = $ksiazki->appendChild(
                     $dokument->createElement('book')
                  );

                  $ptop5->setAttribute('lang', 'pl');

                  $ptop5->appendChild(
                     $dokument->createElement(
                       'author',
                       'Sebastian Bergmann'
                     )
                  );

                  $ptop5->appendChild(
                     $document->createElement(
                       'title',
                       'Profesjonalne tworzenie oprogramowania w PHP 5'
                     )
                  );

                  $ptop5->appendChild(
                     $dokument->createElement(
                       'isbn',
                       '83-246-0069-8'
                     )
                  );

                  print $dokument->saveXML();
                  ?>
                  <?xml version="1.0" encoding="iso-8859-2" ?>
                  <books>
                    <book lang="pl">
                      <author>Sebastian Bergmann</author>
                      <title>Profesjonalne tworzenie oprogramowania w PHP 5</title>
                      <isbn>83-246-0069-8</isbn>
                    </book>
                  </books>
Rozdział 8. ♦ Obsługa XML w PHP                                                          123


Metoda DOMDocument::createElement() tworzy nowy obiekt klasy DOMElement,
z kolei za pomocą metody DOMNode::appendChild() można „podwiesić” utworzony
element w odpowiednim miejscu w drzewie DOM.

Tworzenie nowego dokumentu XML za pomocą klas modelu DOM, tak jak przed-
stawione to zostało na listingu 8.9, może okazać się zadaniem wyjątkowo praco-
chłonnym. W takich przypadkach dobrze jest przygotować zestaw klas rozbudowu-
jących klasy modelu DOM poprzez dziedziczenie i dopasować je do potrzeb
aktualnej aplikacji.

Klasa Book (prezentowana na listingu 8.10) rozbudowuje klasę DOMElement o me-
tody setAuthor($author), setISBN($isbn), setLanguage($language) i setTitle
($title), ściśle powiązane z elementem <book> w drzewie dokumentu XML.
W ten sposób użytkownik tej klasy nie musi już samodzielnie wywoływać metod
DOMDocument::createElement() i DOMNode::appendChild().

  <?php                                                                          Listing 8.10.
  class Book extends DOMElement {                                                Klasa Book
    private $document;

       public function __construct(DOMDocument $document) {
         parent::__construct('book');
         $this->document = $document;
       }

       public function setAuthor($author) {
         $this->appendChild(
            $this->document->createElement(
              'author',
              $author
            )
         );
       }

       public function setISBN($isbn) {
         $this->appendChild(
            $this->document->createElement(
              'isbn',
              $isbn
            )
         );
       }

       public function setLanguage($language) {
         $this->setAttribute('lang', $language);
       }

       public function setTitle($title) {
         $this->appendChild(
            $this->document->createElement(
              'title',
              $title
            )
         );
       }
  }
  ?>
124                                                             Część III ♦ Programowanie w PHP5


                Klasa Books (prezentowana na listingu 8.11) rozbudowuje klasę DOMDocument,
                dodając do niej metodę createBook() pozwalającą w prosty sposób utworzyć
                element typu <book>.

Listing 8.11.     <?php
Klasa Books       require_once 'Book.php';

                  class Books extends DOMDocument {
                    private $books;

                      public function __construct() {
                        parent::__construct('1.0', 'iso-8859-2');

                          $this->books = $this->appendChild(
                             $this->createElement('books')
                          );

                          $this->formatOutput = TRUE;
                      }

                      public function createBook() {
                        $book = new Book($this);
                        $this->books->appendChild($book);

                          return $book;
                      }
                  }

                  $books = new Books;
                  $book = $books->createBook();

                  $book->setAuthor('Sebastian Bergmann');
                  $book->setISBN('83-246-0069-8');
                  $book->setTitle(
                     'Profesjonalne tworzenie oprogramowania w PHP 5'
                  );
                  $book->setLanguage('pl');

                  print $books->saveXML();
                  ?>

                Jak można się domyślić, kod z listingu 8.11 tworzy dokładnie taki sam dokument
                jak kod z listingu 8.9.


                8.4.3. Wykorzystywanie klasy DOMNodeList
                Klasa DOMNodeList reprezentuje zbiór węzłów, czyli obiektów klasy DOMNode. Wę-
                zły w takim zbiorze nie są układane według żadnej konkretnej reguły. W klasie
                DOMNodeList implementowany jest interfejs Traversable (była o nim mowa w roz-
                dziale 3.), dlatego możliwe jest iterowanie przez poszczególne obiekty listy z wy-
                korzystaniem operatora foreach.
Rozdział 8. ♦ Obsługa XML w PHP                                                          125


Na listingu 8.12 korzystamy z metody DOMDocument::getElementsByTagName(), aby
w ten sposób uzyskać listę wszystkich elementów typu <author>. W wyniku swo-
jego działania metoda ta zwraca obiekt klasy DOMNodeList, w którym zawarte są
odpowiednie obiekty typu DOMElement. Następnie za pomocą zapisu $author->
nodeValue odczytywane są wartości węzłów typu DOMText, które dołączone są do
obiektów typu DOMElement zawartych w zmiennej $autor.

  <?php                                                                          Listing 8.12.
  $dokument = DOMDocument::load('books.xml');                                    Zastosowanie
  $autorzy = $dokument->getElementsByTagName('author');                          klasy
                                                                                 DOMNodeList
  foreach ($autorzy as $autor) {
     print $autor->nodeValue . "n";
  }
  ?>
  Sebastian Bergmann
  Emilian Balanescu
  Mihai Bucica
  Cristian Darie



8.4.4. Formułowanie zapytań XPath
Za pomocą klasy DOMXPath można tworzyć zapytania XPath dotyczące drzewa          XPath
DOM. Wynikiem takiego zapytania zawsze jest obiekt klasy DOMNodeList. Przykład
zastosowania tej klasy przedstawiony został na listingu 8.13.

  <?php                                                                          Listing 8.13.
  $dokument = DOMDocument::load('books.xml');                                    Formułowanie
  $xpath    = new DOMXPath($dokument);                                           zapytań XPath

  foreach ($xpath->query('book/title') as $tytul) {
     print $tytul->nodeValue . "n";
  }
  ?>
  Profesjonalne tworzenie oprogramowania w PHP 5
  PHP5 i MySQL. Zastosowania e-commerce



8.4.5. Sprawdzanie poprawności
       dokumentów XML
Rozszerzenie PHP-DOM obok obsługi i tworzenia dokumentów XML pozwala
kontrolować zgodność dokumentów XML ze specyfikacjami zapisanymi w for-
matach DTD (Document Type Definition), XSD (XML Schema) lub RNG (Re-
laxNG).
126                                                                Część III ♦ Programowanie w PHP5


XML Schema       XML Schema8 jest oficjalnie zatwierdzoną przez W3C technologią zastępującą
                 format Document Type Definition. Tworzone schematy stosowane są do definio-
                 wania klas dokumentów XML. Na podstawie przygotowanego schematu można
                 skontrolować, czy konkretny dokument XML spełnia założenia takiego schematu.
                 Taki proces nazywany jest sprawdzaniem zgodności (ang. validate) dokumentu
                 XML ze schematem.

                 Na listingu 8.14 zastosowana została metoda DOMDocument::schemaValidate() udo-
                 stępniana przez PHP5. W tym prostym programie kontrolowana jest zgodność
                 dokumentu books.xml ze schematem XML zapisanym w pliku books.xsd (zawar-
                 tość tego pliku prezentowana jest na listingu 8.15).

 Listing 8.14.       <?php
      Kontrola       $dokument = DOMDocument::load('books.xml');
   zgodności
  ze schema-         if ($dokument->schemaValidate('books.xsd')) {
     tem XML            print 'Plik books.xml jest zgodny z deklaracją schematu '.
                              'zapisaną w pliku books.xsd.';
                     }
                     ?>
                     Plik books.xml jest zgodny z deklaracją schematu zapisaną w pliku books.xsd.

 Listing 8.15.       <?xml version="1.0"?>
Plik schematu
          XML        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     przygoto-         <xsd:element name="books">
      wany dla           <xsd:complexType>
   dokumentu
                           <xsd:sequence>
      katalogu
       książek
                             <xsd:element maxOccurs="unbounded" ref="book"/>
                           </xsd:sequence>
                         </xsd:complexType>
                       </xsd:element>

                       <xsd:element name="book">
                         <xsd:complexType>
                           <xsd:sequence>
                             <xsd:element ref="author" minOccurs="1" maxOccurs="unbounded"/>
                             <xsd:element ref="title" minOccurs="1"/>
                             <xsd:element ref="isbn"   minOccurs="1"/>
                           </xsd:sequence>

                           <xsd:attribute name="lang" use="required" type="xsd:string"/>
                         </xsd:complexType>
                       </xsd:element>

                       <xsd:element name="author" type="xsd:string"/>
                       <xsd:element name="title" type="xsd:string"/>
                       <xsd:element name="isbn"   type="xsd:string"/>
                     </xsd:schema>




                 8
                     http://www.w3.org/XML/Schema
Rozdział 8. ♦ Obsługa XML w PHP                                                           127


RelaxNG jest językiem schematów XML przeznaczonym do definiowania struktury      RelaxNG
dokumentów XML, funkcjonującym równolegle z językiem XML Schema. Język
ten jest obecnie standaryzowany przez organizację ISO, ale nie jest wspierany
przez konsorcjum W3C, choć wykorzystuje typy danych pochodzące z języka XML
Schema. Najprawdopodobniej już wkrótce język RelaxNG stanie się alternatywą
dla języka XML Schema, znacznie prostszą do poznania.

Na listingu 8.16 przedstawiony został sposób wykorzystania metody DOMDocument:
:relaxngValidate(). W tym prostym programie kontrolowana jest zgodność doku-
mentu books.xml z definicją RelaxNG zapisaną w pliku books.rng (zawartość te-
go pliku prezentowana jest na listingu 8.17).

  <?php                                                                          Listing 8.16.
  $dokument = DOMDocument::load('books.xml');                                    Kontrola
                                                                                 zgodności
  if ($dokument->relaxngValidate('books.rng')) {                                 z definicją
                                                                                 RelaxNG
     print 'Plik books.xml jest zgodny z deklaracją RelaxNG '.
           'zapisaną w pliku books.rng.';
  }
  ?>
  Plik books.xml jest zgodny z deklaracją RelaxNG zapisaną w pliku books.rng.


  <?xml version="1.0" encoding="UTF-8"?>                                         Listing 8.17.
                                                                                 Plik deklaracji
  <grammar xmlns="http://relaxng.org/ns/structure/1.0"                           RelaxNG
            datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">        przygoto-
    <start>                                                                      wany dla
                                                                                 dokumentu
      <element name="books">
                                                                                 katalogu
        <oneOrMore>                                                              książek
          <element name="book">
             <attribute name="lang">
               <data type="NMTOKEN"/>
             </attribute>

            <oneOrMore>
              <element name="author">
                <text/>
              </element>
            </oneOrMore>

            <element name="title">
              <text/>
            </element>

            <element name="isbn">
              <text/>
            </element>
          </element>
        </oneOrMore>
      </element>
    </start>
  </grammar>
128                                                            Część III ♦ Programowanie w PHP5


                8.4.6. Wady i zalety
                       Zaleta: Implementacja potężnego standardu.
                       Zaleta: Możliwość odczytywania i zapisywania danych dowolnego
                       elementu XML.
                       Wada: Powolne działanie i duże zapotrzebowanie na pamięć, ponieważ
                       tworzone jest pełne drzewo obiektów opisujące dokument XML.



                8.5. Transformacje XSL (XSLT)
                Na obecnym etapie rozwoju aplikacji WWW nie można w nich pominąć operacji
                przekształcania danych z formatu XML na inny format, na przykład HTML lub PDF.
                Do realizacji tego zadania konsorcjum W3C proponuje nam język XSL9 (eXtensible
                Stylesheet Language). Język ten składa się z trzech komponentów:
                       Język XSL Transformations (XSLT)10 stanowi osobny język programowania
                       opisujący transformacje XML.
                       Język XML Path Language (XPath) wykorzystywany jest w języku XSLT
                       do uzyskiwania dostępu do całości dokumentu XML lub jego części.
                       Język XSL Formatting Objects (XSL-FO) stosowany jest do opisywania
                       formatowania danych.

                Pod względem zasady działania język XSLT jest spokrewniony z uniksowym
                narzędziem awk. Warunki (Template Match) albo funkcje (Template Name) sto-
                sowane są po kolei na danych wejściowych. Dla narzędzia awk dane te składają
                się z wierszy tekstu, natomiast dla języka XSLT danymi wejściowymi jest struktu-
                ra drzewiasta. Język XSLT, podobnie jak awk, nie może korzystać z przygoto-
                wanych przez siebie danych wyjściowych.

                Programy napisane w języku XSLT właściwie są tylko dokumentami XML, a ze
                względów historycznych nazywane są arkuszami stylów. Z tego właśnie powodu
                pisanie w tym języku jest wyjątkowo czasochłonne, ponieważ nawet najprostsze
                konstrukcje wymagają wpisywania dużej ilości tekstu. Na listingu 8.18 przed-
                stawiony został kod wymagany do zrealizowania w języku XSLT prostej konstruk-
                cji if-then-else, natomiast na listingu 8.19 — odpowiadający mu wycinek kodu
                w języku PHP.

Listing 8.18.        <xsl:template match="/">
Konstrukcja            <xsl:choose>
 if-then-else            <xsl:when test="$foobar = 'foo'">
     w języku              <xsl:call-template name="foo"/>
        XSLT


                9
                     http://www.w3.org/Style/XSL/
                10
                     http://www.w3.org/TR/xslt
Rozdział 8. ♦ Obsługa XML w PHP                                                            129


         </xsl:when>
         <xsl:otherwise>
           <xsl:call-template name="bar"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:template>

     <?php                                                                         Listing 8.19.
     if ($foobar == 'foo') foo() else bar();                                       Konstrukcja
     ?>                                                                            if-then-else
                                                                                   w języku PHP
Podobnie jak język DSSSL (Document Style Semantics and Specification Lan-          Język
guage)11 dla języka SGML, język XSLT jest funkcyjnym językiem transformacji        transformacji
dla języka XML. Oznacza to, że zawiera on wszystkie wady języków funkcjonal-
nych, takie jak wykorzystywanie rekursji do tworzenia pętli albo obsługa zmien-
nych, które są bardziej stałymi niż zmiennymi. Poza tym nie pozwala korzystać
z zalet programowania funkcjonalnego, czyli programowania z domknięciami albo
obliczeń korzystających z funkcji jako typów danych. Takich możliwości język
XSLT nie udostępnia.

Kolejną wadą języka XSLT jest ograniczenie jego domeny. Co prawda „wie on
wszystko” na temat XML i udostępnia wiele funkcji obsługujących takie doku-
menty, ale niestety nie ma wielkich możliwości działania w dziedzinach wykra-
czających poza XML. Bez wykorzystywania innych języków programowania,
takich jak Java, dołączanych do programów tworzonych w języku XSLT poprzez
funkcje wywołań zwrotnych, programy te nie są w stanie wykonać jakiejkolwiek
operacji poza światem XML. Bez zewnętrznej pomocy nie jest w nich możliwe
dołączenie danych z innych źródeł, na przykład baz danych, albo generowanie da-
nych w formatach nietekstowych, na przykład grafik lub plików PDF.


8.5.1. Interfejs programowy XSLT w PHP
PHP5 udostępnia podobną do interfejsu programistycznego projektu Mozilla klasę
XSLTProcessor (prezentowaną na rysunku 8.4), służącą do wykonywania transfor-
macji XSLT. W przeciwieństwie do omawianych wcześniej interfejsów progra-
mowej obsługi formatu XML, rozszerzenie obsługi XSLT nie jest dołączane do
standardowej konfiguracji PHP5. Musi być ono specjalnie aktywowane w czasie
budowania pakietu poprzez dodanie w wierszu poleceń parametru --with-xsl
(proszę przejrzeć Dodatek A).

Na listingu 8.21 za pomocą metody DOMDocument::load() tworzony jest obiekt
klasy DOMDocument, do którego ładowane są zarówno dokument XML (przedsta-
wiony na listingu 8.1), jak i arkusz stylów XSL (prezentowany na listingu 8.20).
Poprzez metody importStylesheet() i transformToDoc() obiekt arkusza stylów
XLS przekazywany jest do obiektu procesora XSLT, a dokument wejściowy trans-
formowany do nowego obiektu klasy DOMDocument.


11
     http://www.jclark.com/dsssl/
130                                                            Część III ♦ Programowanie w PHP5

Rysunek 8.4.
Klasa XSLT-
  Processor




 Listing 8.20.   <?xml version="1.0" encoding="iso-8859-2"?>
        Arkusz   <xsl:stylesheet version="1.0"
 stylów XSLT                      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 dla katalogu      <xsl:output method="html" />
       książek     <xsl:template match="/">
                     <html>
                       <body>
                         <ul>
                           <xsl:for-each select="books/book">
                              <li>
                                <xsl:value-of select="author" /><br />
                                <xsl:value-of select="title" /><br />
                                ISBN: <xsl:value-of select="isbn" /><br />
                              </li>
                           </xsl:for-each>
                         </ul>
                       </body>
                     </html>
                   </xsl:template>
                 </xsl:stylesheet>

 Listing 8.21.   <?php
Przekształca-    $dokument    = DOMDocument::load('books.xml');
 nie katalogu    $arkuszStylów = DOMDocument::load('books.xsl');
       książek
    z formatu    $procesor = new XSLTProcessor;
          XML
                 $procesor->importStylesheet($arkuszStylów);
    na format
        HTML
wykonywane       print $procesor->transformToDoc($dokument)->saveXML();
  przez język    ?>
         XSLT    <?xml version="1.0" standalone"yes"?>
                 <html>
                   <body>
                     <ul>
                        <li>
                          Sebastian Bergmann<br/>
                          Profesjonalne tworzenie oprogramowania w PHP 5<br/>
                          83-246-0069-8<br/>
                        </li>
Rozdział 8. ♦ Obsługa XML w PHP                                                           131


        <li>
          Emilian Balanescu<br/>
          PHP5 i MySQL. Zastosowania e-commerce<br/>
          83-7361-830-9<br/>
        </li>
      </ul>
    </body>
  </html>

Alternatywnym sposobem wykonania tej operacji jest wykorzystanie metod
transformToUri() i transformToXML(), które wynik transformacji dokumentu za-
pisują w pliku albo zwracają w postaci ciągu znaków.

Parametry arkusza stylów XSL można kontrolować za pomocą metod getPara-
meter(), setParameter() i removeParameter().


8.5.2. Wywoływanie funkcji PHP
       z poziomu języka XSLT
Za pomocą funkcji XSL php:function można wywoływać dowolne funkcje PHP
z wnętrza arkusza stylów XSL. W celu wywołania takiej funkcji koniecznie na-
leży zadeklarować odpowiednią przestrzeń nazw, korzystając przy tym z konstruk-
cji xmlns:php="http://php.net/xsl" (tak jak na listingu 8.22). Z kolei za pomocą
metody registerPHPFunctions() obiektu procesora XSLT aktywowana jest obsługa
wykonywania funkcji PHP wywoływanych z arkuszy stylów XSL (proszę spojrzeć
na listing 8.23).

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                 Listing 8.22.
                  xmlns:php="http://php.net/xsl" version='1.0'>                    Zastosowanie
    <xsl:template match="/">                                                       funkcji PHP
      <xsl:value-of select="php:function('str_rot13', 'CUC 5')"/>                  w arkuszu
                                                                                   stylów XSL
    </xsl:template>
  </xsl:stylesheet>

  <?php                                                                            Listing 8.23.
  $arkuszStylów = DOMDocument::load('php_function.xsl');                           Transformacje
                                                                                   wykonywane
  $procesor = new XSLTProcessor;                                                   w arkuszu
                                                                                   stylów XSL
  $procesor->registerPHPFunctions();
                                                                                   korzystającym
  $procesor->importStylesheet($arkuszStylów);                                      z funkcji PHP

  $wynik = $procesor->transformToDoc(new DOMDocument);
  print $wynik->saveXML();
  ?>
  PHP 5
132                                                                Część III ♦ Programowanie w PHP5



                 8.6. Przenoszenie obiektów
                      do sieci WWW za pomocą
                      biblioteki XML_Transformer
                 Biblioteka XML_Transformer12 (sposób jej instalacji przedstawiony został na
                 rysunku 8.5) wzorowana jest na rozwiązaniach dwóch zadań, które na pierwszy
                 rzut oka nie mają ze sobą nic wspólnego. Po pierwsze, wielu programistów szu-
                 ka możliwości przeniesienia obiektów PHP „do sieci WWW”. Po drugie, prze-
                 kształcenia danych XML z jednego formatu na inny są nieodłącznym elementem
                 tworzenia aplikacji WWW.
Rysunek 8.5.
Instalowanie
    biblioteki
       XML_      W przeciwieństwie do transformacji XSL rozwiązujących przedstawione wyżej
 Transformer
                 cząstkowe problemy, biblioteka XML_Transformer pozwala na proceduralną de-
                 finicję transformacji XSL. W bibliotece tej można wykorzystać najróżniejsze moż-
                 liwości PHP, takie jak dostęp do baz danych albo tworzenie grafiki. Dodatkowo,
                 inaczej niż w języku XSLT, wynik działania jednej z operacji pośrednich może
                 być wykorzystany jako wejście kolejnego kroku procesu.


                 8.6.1. Użytkowanie biblioteki
                        XML_Transformer
   Procedury     Mówiąc ogólnie, kodowanie za pomocą biblioteki XML_Transformer polega na
      obsługi    wykorzystaniu istniejących procedur obsługi przestrzeni nazw (ang. namespace
  przestrzeni
        nazw     handler) lub na tworzeniu własnych. Na listingu 8.24 przedstawione zostało za-
                 stosowanie zawartej w pakiecie procedury obsługi przestrzeni nazw Image. Pro-
                 cedura ta stanowi „inteligentną” wersję elementu <img />, która automatycznie
                 dopasowuje wartości atrybutów width i height na podstawie informacji o obrazie
                 uzyskanych za pomocą funkcji getimagesize().

Listing 8.24.         <?php
Inteligentny          require_once 'XML/Transformer.php';
    znacznik          require_once 'XML/Transformer/Namespace/Image.php';
      <img />
z procedurą           $t = new XML_Transformer(
      obsługi            array(
 przestrzeni
                           'debug'                => TRUE,
nazw Image
                           'overloadedNamespaces' => array(
                             'img' => new XML_Transformer_Namespace_Image
                           )
                         )
                      );



                 12
                      http://www.sebastian-bergmann.de/XML_Transformer/
Rozdział 8. ♦ Obsługa XML w PHP                                                            133


  print $t->transform('<img:img src="image.png" />');
  ?>
  <img height="42" src="image.png" width="23" />

W celu wykonania tych operacji najpierw ładowane są klasy XML_Transformer
i XML_Transformer_Namespace_Image. Następnie tworzony jest obiekt klasy XML_
Transformer, a w jego konstruktorze przekazywana jest przestrzeń nazw img, zwią-
zana z obiektem klasy XML_Transformer_Namespace_Image. Faktyczna transforma-
cja wykonywana jest w metodzie transform, której w jedynym parametrze prze-
kazywany jest wejściowy element XML w postaci ciągu znaków.

Do ustalania parametrów i definiowania transformacji w klasie XML_Transformer
udostępniane są odpowiednie metody. Na listingu 8.25 najpierw tworzony jest
zatem obiekt klasy XML_Transformer, dla którego aktywowany jest tryb debugo-
wania i ładowane są transformacje procedury obsługi przestrzeni nazw.

  <?php                                                                            Listing 8.25.
  require_once 'XML/Transformer.php';                                              Ustalanie
  require_once 'XML/Transformer/Namespace/Image.php';                              parametrów
                                                                                   za pomocą
  $t = new XML_Transformer;                                                        metod klasy
                                                                                   XML_
                                                                                   Transformer
  $t->setDebug(TRUE);

  $t->overloadNamespace(
     'img',
     new XML_Transformer_Namespace_Image
  );
  ?>

Parametry transformacji można ustalać również w momencie tworzenia obiektu,
przekazując je konstruktorowi klasy XML_Transformer, tak jak zrobione to zostało
na listingu 8.24.


8.6.2. Stosowanie klasy sterownika
       XML_Transformer
Biblioteka XML_Transformer, oprócz możliwości bezpośredniego korzystania z kla-    Klasy
sy XML_Transformer i wykonywania transformacji za pomocą jej metody trans-         sterowników
form, udostępnia klasy sterowników, rozbudowujących standardowe zachowania
tej klasy. Na listingu 8.26 przedstawiony został sposób użycia klasy sterownika
XML_Transformer_Driver_OutputBuffer, która korzysta z dostępnego w PHP me-
chanizmu bufora wyjściowego (ang. output-buffer), aby zachować w buforze całość
danych wyjściowych skryptu, w którym jest używana, a następnie zastosować je
jako wejściowy dokument XML.

  <?php                                                                            Listing 8.26.
  require_once 'XML/Transformer/Driver/OutputBuffer.php';                          Zastosowanie
  require_once 'XML/Transformer/Namespace/Image.php';                              sterownika
                                                                                   Output-Buffer
134                                                             Część III ♦ Programowanie w PHP5


                   $t = new XML_Transformer_Driver_OutputBuffer(
                      array(
                        'overloadedNamespaces' => array(
                          'img' => new XML_Transformer_Namespace_Image
                        )
                       )
                   );
                   ?>
                   <img:img src="image.png" />

                 Inną klasą sterownika jest klasa XML_Transformer_Driver_Cache, która zapisuje
                 w buforze wynik wykonanej transformacji. Dzięki temu można pominąć przyszłe
                 transformacje wykonywane na identycznych danych wejściowych i podać goto-
                 wy wynik pobrany z takiego bufora.


                 8.6.3. Dostarczane procedury obsługi
                        przestrzeni nazw
                 Poznaliśmy już jedną procedurę obsługi przestrzeni nazw zawartą w klasie XML_
                 Transformer_Namespace_Image, należącej do biblioteki XML_Transformer. Teraz
                 przedstawione zostaną skrócone opisy pozostałych procedur obsługi przestrzeni
                 nazw dostarczanych wraz z biblioteką.

                 Anchor
                 Procedura obsługi przestrzeni nazw Anchor udostępnia cały szereg znaczników,
                 które normalnie pozwalają na tworzenie pośrednich, nazwanych łączy powiąza-
                 nych z przestrzenią nazw a, czyli tak zwanych URN. Przykład zastosowania tej
                 procedury został przedstawiony na listingu 8.27.

 Listing 8.27.     <?php
     Przykład      require_once 'XML/Transformer/Driver/OutputBuffer.php';
zastosowania       require_once 'XML/Transformer/Namespace/Anchor.php';
   procedury
       obsługi     $t = new XML_Transformer_Driver_OutputBuffer(
  przestrzeni         array(
nazw Anchor
                        'overloadedNamespaces' => array(
                           'anchor' => new XML_Transformer_Namespace_Anchor
                         )
                      )
                   );
                   ?>
                   <!-- Tworzy nowy wpis -->
                   <anchor:link name="php" href="http://www.php.net/"
                      title="PHP Homepage" />

                   <!-- Tworzy znacznik HTML <a /> -->
                   <anchor:iref iref="php">The PHP Homepage</anchor:iref>
                   <a href="http://www.php.net/" title="PHP Homepage">The PHP Homepage</a>
Rozdział 8. ♦ Obsługa XML w PHP                                                           135


DocBook
Procedura obsługi przestrzeni nazw DocBook udostępnia transformacje pozwala-
jące na przekształcenie podzbioru znaczników DocBook XML na format HTML.
Można ją traktować jako przykładową kompletną implementację procedury obsługi
przestrzeni nazw, w której wykonanie transformacji wymaga wykonania kilku
przebiegów. Podobnie jak w procesorze LaTeX, w pierwszym przebiegu zbierane
są dane na temat dokumentu, a w kolejnym są one odpowiednio przetwarzane.

Image
Procedura obsługi przestrzeni nazw Image, obok prezentowanego już „inteligent-
nego” znacznika <img /> udostępnia funkcję dynamicznego generowania grafiki.
Działanie i sposób użycia tej funkcji wzorowane są na znaczniku <gtext /> po-
chodzącym z platformy Roxen. Przykład użycia tego znacznika przedstawiony
został na listingu 8.28.

  <?php                                                                            Listing 8.28.
  require_once 'XML/Transformer/Driver/OutputBuffer.php';                          Przykład
  require_once 'XML/Transformer/Namespace/Image.php';                              zastosowania
                                                                                   znacznika
  $t = new XML_Transformer_Driver_OutputBuffer(                                    <img:gtext />
     array(
       'overloadedNamespaces' => array(
         'img' => new XML_Transformer_Namespace_Image
       )
     )
  );
  ?>
  <html>
     <body>
       <img:gtext bgcolor="#ffffff" fgcolor="#000000">
         Tekst graficzny
       </img:gtext>
     </body>
  </html>
  <html>
    <body>
      <img alt="Tekst graficzny"
            src="/cache/gtext/51445ca8cca0490794648630776939e5.png"
            width="113"
            height="16" />
    </body>
  </html>

W procedurze obsługi przestrzeni nazw Image wykorzystywany jest specjalny bufor,
w którym składowane są grafiki wygenerowane przez znaczniki <img:gtext />,
dzięki czemu nie trzeba ponownie tworzyć grafiki przy kolejnym żądaniu o takich
samych parametrach.
136                                                             Część III ♦ Programowanie w PHP5


                 PHP
                 Procedura obsługi przestrzeni nazw PHP pozwala między innymi na włączenie
                 kodu PHP bezpośrednio do dokumentu XML, a także na dynamiczne deklarowanie
                 nowych transformacji. Przykład użycia tej procedury przedstawiony został na li-
                 stingu 8.29.

 Listing 8.29.     <?php
     Przykład      require_once 'XML/Transformer_OutputBuffer.php';
zastosowania       require_once 'XML/Transformer/Namespace/PHP.php';
   procedury
       obsługi     $t = new XML_Transformer_OutputBuffer(
  przestrzeni         array(
   nazw PHP
                        'overloadedNamespaces' => array(
                          'php' => new XML_Transformer_Namespace_PHP
                        )
                      )
                   );
                   ?>
                   <dl>
                      <dd><php:expr>time()</php:expr></dd>
                      <php:setvariable name="foo">bar</php:setvariable>
                      <dd>foo = <php:getvariable name="foo"/></dd>
                   </dl>
                   <dl>
                     <dd>1045740810</dd>
                     <dd>foo = bar</dd>
                   </dl>


                 Widget
                 Procedura obsługi przestrzeni nazw Widget udostępnia między innymi transfor-
                 macje podobne do wykonywanych przez znaczniki <obox /> z platformy Roxen.


                 8.6.4. Tworzenie własnej procedury
                        obsługi przestrzeni nazw
                 W tym punkcie zajmiemy się sposobami przygotowania własnej procedury obsługi
                 przestrzeni nazw. Jak można się było przekonać w podawanych wcześniej przy-
                 kładach, biblioteka XML_Transformer wiąże funkcje PHP z elementami XML,
                 przy czym dana klasa wiązana jest z określoną przestrzenią nazw. Pseudoprzestrzeń
                 nazw &MAIN pozwala na podobne operacje bez dowiązywania konkretnej przestrze-
                 ni nazw. Klasa PHP wywiedziona z klasy XML_Transformer_Namespace dla każdego
                 elementu powiązanej z nią przestrzeni nazw implementuje dwie metody opisujące
                 transformacje. Metoda start_ELEMENT($attributes) wywoływana jest z atrybu-
                 tami zapisanymi w parametrze $attributes dla każdego otwierającego znacznika
                 elementu, natomiast metoda end_ELEMENT($cdata) wywoływana jest dla znaczni-
                 ków zamykających element, a w jej parametrze przekazywane są dane CDATA tego
                 elementu.
Rozdział 8. ♦ Obsługa XML w PHP                                                            137


Obie metody mogą (ale nie muszą) zwracać fragment danych XML w postaci
ciągu znaków, który włączany jest do danych wyjściowych w zastępstwie aktu-
alnie obsługiwanego elementu XML. Trzeba przy tym uważać, aby zwracany frag-
ment nie naruszał prawidłowej budowy dokumentu XML.

Na listingu 8.30 przedstawiona została klasa WitajSwiecie, która implementuje
taką właśnie procedurę obsługi przestrzeni nazw i za pomocą metod start_
witajSwiecie() i end_witajSwiecie() udostępnia transformację znaczników <witaj-
Swiecie />.

  <?php                                                                           Listing 8.30.
  require_once 'XML/Transformer/Driver/OutputBuffer.php';                         Procedury
  require_once 'XML/Transformer/Namespace.php';                                   obsługi
                                                                                  przestrzeni
  class WitajSwiecie extends XML_Transformer_Namespace {                          nazw „Witaj
    function start_witajSwiecie($atrybuty) {                                      świecie”
      return '<html><body>';
    }

      function end_witajSwiecie($cdata) {
        return $cdata . 'Witaj świecie!</body></html>';
      }
  }

  $t = new XML_Transformer_Driver_OutputBuffer(
     array(
       'overloadedNamespaces' => array(
         '&MAIN' => new WitajSwiecie
       )
     )
  );
  ?>
  <witajŚwiecie />
  <html>
    <body>
      Witaj świecie!
    </body>
  </html>

Klasa XMLUtil udostępnia metody, które mogą być bardzo użyteczne w czasie
tworzenia aplikacji PHP pracujących z danymi w formacie XML. W czasie pro-
gramowania procedur obsługi przestrzeni nazw z wykorzystaniem biblioteki XML_
Transformer najbardziej powinny nas zainteresować następujące metody:
      attributesToString($attributes) — zamienia w ciąg znaków tablicę
      atrybutów XML, na przykład taką, jaka przekazywana jest w parametrze
      do metody start_ELEMENT($attributes). Przykład użycia tej metody
      przedstawiony został na listingu 8.31.

        <?php                                                                     Listing 8.31.
        require_once 'XML/Util.php';                                              Przykład
                                                                                  zastosowania
        print XML_Util::attributesToString(                                       metody XML_
          array(                                                                  Util::attributes-
                                                                                  ToString
138                                                               Część III ♦ Programowanie w PHP5


                                  'width' => 23,
                                  'height' => 42
                              )
                         );
                         ?>
                         height="42" width="23"

                       splitQualifiedName($element) — rozdziela nazwę elementu XML
                       na nazwę przestrzeni nazw i właściwą nazwę elementu oraz zwraca wynik
                       takiej operacji w postaci tablicy. Przykład użycia tej metody przedstawiony
                       został na listingu 8.32.

  Listing 8.32.          <?php
      Przykład           require_once 'XML/Util.php';
 zastosowania
        metody           print_r(
     XML_Util:              XML_Util::splitQualifiedName('img')
:splitQualified-
                         );
         Name

                         print_r(
                            XML_Util::splitQualifiedName('img:img')
                         );
                         ?>
                         Array
                         (
                             [0]     => &MAIN
                             [1]     => img
                         )
                         Array
                         (
                             [0]     => img
                             [1]     => img
                         )

                   W czasie tworzenia procedury obsługi przestrzeni nazw należy zawsze pamiętać,
                   że biblioteka XML_Transformer wewnętrznie pracuje z parserem SAX. Z tego po-
                   wodu nie jest możliwe utworzenie w jednym przebiegu spisu zawartości doku-
                   mentu XML ani transformacje zmieniające kolejność elementów. Jeżeli wykonanie
                   takich operacji jest mimo wszystko wymagane, to wejściowe dane XML muszą
                   być transformowane w dwóch przebiegach. Wartość TRUE wpisana do atrybutu
                   $secondPassRequired oznacza, że w czasie transformacji konieczne jest wyko-
                   nanie dwóch przebiegów.

       Tryb        W czasie tworzenia własnych procedur obsługi przestrzeni nazw biblioteka XML_
debugowania        Transformer może wspomagać nas swoim specjalnym trybem debugowania. Tryb
                   ten może być aktywowany poprzez przekazanie odpowiedniego parametru do kon-
                   struktora klasy XML_Transformer albo bezpośrednie wywołanie metody setDebug
                   (TRUE), tak jak zostało to zrobione na listingach 8.24 i 8.25.
Rozdział 8. ♦ Obsługa XML w PHP                                                         139


    Dla każdego otwierającego znacznika elementu XML w dzienniku
    zapisywane są: aktualny poziom stosu elementów, nazwa elementu oraz
    jego atrybuty.
    Dla każdego zamykającego znacznika elementu XML zapisywane są:
    aktualny poziom stosu elementów, nazwa elementu oraz zawartość jego
    obszaru CDATA.

Na rysunku 8.6 przedstawione zostały informacje debugowania zapisane dla ko-
du z listingu 8.24.
                                                                                 Rysunek 8.6.
                                                                                 Komunikaty
                                                                                 debugowania
                                                                                 z przykładu
Przy ustawieniach domyślnych komunikaty debugowania przesyłane są do dzien-      dla znacznika
                                                                                 <img>
nika błędów serwera WWW. Wypisywanie ich na ekranie jest oczywiście moż-
liwe, z wyjątkiem przypadku zastosowania klasy sterownika XML_Transformer_
Driver_OutputBuffer.

Błędy występujące w czasie obsługiwania danych XML są zapisywane do dzien-
nika niezależnie od tego, czy tryb debugowania został włączony. Dzięki dostęp-
ności zrzutu stosu (ang. stackdump) można określić miejsce w dokumencie XML,
w którym nastąpiło naruszenie jego prawidłowej budowy. Takie naruszenie może
nastąpić w samym dokumencie XML albo wynikać z jego transformacji. Przykład
takiego komunikatu przedstawiony został na rysunku 8.7.
                                                                                 Rysunek 8.7.
                                                                                 Komunikat
                                                                                 o błędzie
                                                                                 klasy XML_
                                                                                 Transformer
                                                                                 zawierający
                                                                                 zrzut stosu

More Related Content

What's hot

Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programistyWydawnictwo Helion
 
PHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIPHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIWydawnictwo Helion
 
PHP. 101 praktycznych skryptów. Wydanie II
PHP. 101 praktycznych skryptów. Wydanie IIPHP. 101 praktycznych skryptów. Wydanie II
PHP. 101 praktycznych skryptów. Wydanie IIWydawnictwo Helion
 
Delphi 2005. 303 gotowe rozwiązania
Delphi 2005. 303 gotowe rozwiązaniaDelphi 2005. 303 gotowe rozwiązania
Delphi 2005. 303 gotowe rozwiązaniaWydawnictwo Helion
 
PHP. Programowanie w systemie Windows. Vademecum profesjonalisty
PHP. Programowanie w systemie Windows. Vademecum profesjonalistyPHP. Programowanie w systemie Windows. Vademecum profesjonalisty
PHP. Programowanie w systemie Windows. Vademecum profesjonalistyWydawnictwo Helion
 
Wstęp do programowania w języku C#
Wstęp do programowania w języku C#Wstęp do programowania w języku C#
Wstęp do programowania w języku C#Wydawnictwo Helion
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanieWydawnictwo Helion
 
Visual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyVisual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyWydawnictwo Helion
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIWydawnictwo Helion
 
Visual C# 2005 Express Edition. Od podstaw
Visual C# 2005 Express Edition. Od podstawVisual C# 2005 Express Edition. Od podstaw
Visual C# 2005 Express Edition. Od podstawWydawnictwo Helion
 
Delphi 2005. Ćwiczenia praktyczne
Delphi 2005. Ćwiczenia praktyczneDelphi 2005. Ćwiczenia praktyczne
Delphi 2005. Ćwiczenia praktyczneWydawnictwo Helion
 
Zrozumieć platformę .NET. Wydanie II
Zrozumieć platformę .NET. Wydanie IIZrozumieć platformę .NET. Wydanie II
Zrozumieć platformę .NET. Wydanie IIWydawnictwo Helion
 
Perl. Zaawansowane programowanie. Wydanie II
Perl. Zaawansowane programowanie. Wydanie IIPerl. Zaawansowane programowanie. Wydanie II
Perl. Zaawansowane programowanie. Wydanie IIWydawnictwo Helion
 

What's hot (20)

ABC Delphi 2006
ABC Delphi 2006ABC Delphi 2006
ABC Delphi 2006
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programisty
 
PHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIPHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie III
 
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki startC# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
 
PHP. 101 praktycznych skryptów. Wydanie II
PHP. 101 praktycznych skryptów. Wydanie IIPHP. 101 praktycznych skryptów. Wydanie II
PHP. 101 praktycznych skryptów. Wydanie II
 
Delphi 2005. 303 gotowe rozwiązania
Delphi 2005. 303 gotowe rozwiązaniaDelphi 2005. 303 gotowe rozwiązania
Delphi 2005. 303 gotowe rozwiązania
 
Visual C# .NET. Encyklopedia
Visual C# .NET. EncyklopediaVisual C# .NET. Encyklopedia
Visual C# .NET. Encyklopedia
 
PHP. Programowanie w systemie Windows. Vademecum profesjonalisty
PHP. Programowanie w systemie Windows. Vademecum profesjonalistyPHP. Programowanie w systemie Windows. Vademecum profesjonalisty
PHP. Programowanie w systemie Windows. Vademecum profesjonalisty
 
Wstęp do programowania w języku C#
Wstęp do programowania w języku C#Wstęp do programowania w języku C#
Wstęp do programowania w języku C#
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie
 
Delphi. Szybki start
Delphi. Szybki startDelphi. Szybki start
Delphi. Szybki start
 
ABC Delphi 6
ABC Delphi 6ABC Delphi 6
ABC Delphi 6
 
Visual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyVisual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programisty
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie II
 
Visual C# 2005 Express Edition. Od podstaw
Visual C# 2005 Express Edition. Od podstawVisual C# 2005 Express Edition. Od podstaw
Visual C# 2005 Express Edition. Od podstaw
 
Delphi 2005. Ćwiczenia praktyczne
Delphi 2005. Ćwiczenia praktyczneDelphi 2005. Ćwiczenia praktyczne
Delphi 2005. Ćwiczenia praktyczne
 
Flash i PHP5. Podstawy
Flash i PHP5. PodstawyFlash i PHP5. Podstawy
Flash i PHP5. Podstawy
 
Zrozumieć platformę .NET. Wydanie II
Zrozumieć platformę .NET. Wydanie IIZrozumieć platformę .NET. Wydanie II
Zrozumieć platformę .NET. Wydanie II
 
UNIX. Sztuka programowania
UNIX. Sztuka programowaniaUNIX. Sztuka programowania
UNIX. Sztuka programowania
 
Perl. Zaawansowane programowanie. Wydanie II
Perl. Zaawansowane programowanie. Wydanie IIPerl. Zaawansowane programowanie. Wydanie II
Perl. Zaawansowane programowanie. Wydanie II
 

Viewers also liked

Statystyki wypadków rowerowych w Gdańsku 2007-2013
Statystyki wypadków rowerowych w Gdańsku 2007-2013Statystyki wypadków rowerowych w Gdańsku 2007-2013
Statystyki wypadków rowerowych w Gdańsku 2007-2013Justyna Malinowska
 
nik-p-12-096-teleinformatyka-policji
nik-p-12-096-teleinformatyka-policjinik-p-12-096-teleinformatyka-policji
nik-p-12-096-teleinformatyka-policjiAdam Zakrzewski
 
Strategia stabilnego wzrostu_na_
Strategia stabilnego wzrostu_na_Strategia stabilnego wzrostu_na_
Strategia stabilnego wzrostu_na_Grupa PTWP S.A.
 
Rozwój sieci ciepłowniczej #OddychajWarszawo #CzystePowietrzeDlaWarszawy
Rozwój sieci ciepłowniczej #OddychajWarszawo #CzystePowietrzeDlaWarszawyRozwój sieci ciepłowniczej #OddychajWarszawo #CzystePowietrzeDlaWarszawy
Rozwój sieci ciepłowniczej #OddychajWarszawo #CzystePowietrzeDlaWarszawyMichał Olszewski
 
Visual Basic 2005. Zapiski programisty
Visual Basic 2005. Zapiski programistyVisual Basic 2005. Zapiski programisty
Visual Basic 2005. Zapiski programistyWydawnictwo Helion
 
Nowoczesna Firma
Nowoczesna FirmaNowoczesna Firma
Nowoczesna FirmaAdam
 
Marketing w wyszukiwarkach 2015 - raport Interaktywnie.com
Marketing w wyszukiwarkach  2015 - raport Interaktywnie.comMarketing w wyszukiwarkach  2015 - raport Interaktywnie.com
Marketing w wyszukiwarkach 2015 - raport Interaktywnie.comAnna Piekart
 
Dzielenie się wiedzą – jako przykład (nie
Dzielenie się wiedzą – jako przykład (nieDzielenie się wiedzą – jako przykład (nie
Dzielenie się wiedzą – jako przykład (nieKatarzyna Materska
 
Napędza nas czysta energia
Napędza nas czysta energiaNapędza nas czysta energia
Napędza nas czysta energiaNequit
 
Scalone dokumenty (32)
Scalone dokumenty (32)Scalone dokumenty (32)
Scalone dokumenty (32)gemix gemix
 
Oscylatory i ich praktyczne zastosowanie
Oscylatory i ich praktyczne zastosowanie Oscylatory i ich praktyczne zastosowanie
Oscylatory i ich praktyczne zastosowanie X-Trade Brokers
 
Odpowiedzialność administracyjna w obrocie instrumentami finansowymi - ebook
Odpowiedzialność administracyjna w obrocie instrumentami finansowymi - ebookOdpowiedzialność administracyjna w obrocie instrumentami finansowymi - ebook
Odpowiedzialność administracyjna w obrocie instrumentami finansowymi - ebooke-booksweb.pl
 
Social Media Optimisation, ROI i KPI 2012/2012
Social Media Optimisation, ROI i KPI 2012/2012Social Media Optimisation, ROI i KPI 2012/2012
Social Media Optimisation, ROI i KPI 2012/2012Sotrender
 
Zdrowy styl życia 2013. Cyfrowy raport syndykatowy
Zdrowy styl życia 2013. Cyfrowy raport syndykatowy Zdrowy styl życia 2013. Cyfrowy raport syndykatowy
Zdrowy styl życia 2013. Cyfrowy raport syndykatowy IRCenter
 

Viewers also liked (20)

Statystyki wypadków rowerowych w Gdańsku 2007-2013
Statystyki wypadków rowerowych w Gdańsku 2007-2013Statystyki wypadków rowerowych w Gdańsku 2007-2013
Statystyki wypadków rowerowych w Gdańsku 2007-2013
 
nik-p-12-096-teleinformatyka-policji
nik-p-12-096-teleinformatyka-policjinik-p-12-096-teleinformatyka-policji
nik-p-12-096-teleinformatyka-policji
 
Strategia stabilnego wzrostu_na_
Strategia stabilnego wzrostu_na_Strategia stabilnego wzrostu_na_
Strategia stabilnego wzrostu_na_
 
Rozwój sieci ciepłowniczej #OddychajWarszawo #CzystePowietrzeDlaWarszawy
Rozwój sieci ciepłowniczej #OddychajWarszawo #CzystePowietrzeDlaWarszawyRozwój sieci ciepłowniczej #OddychajWarszawo #CzystePowietrzeDlaWarszawy
Rozwój sieci ciepłowniczej #OddychajWarszawo #CzystePowietrzeDlaWarszawy
 
Windows XP. Rejestr systemu
Windows XP. Rejestr systemuWindows XP. Rejestr systemu
Windows XP. Rejestr systemu
 
Z3.02 u
Z3.02 uZ3.02 u
Z3.02 u
 
Visual Basic 2005. Zapiski programisty
Visual Basic 2005. Zapiski programistyVisual Basic 2005. Zapiski programisty
Visual Basic 2005. Zapiski programisty
 
Nowoczesna Firma
Nowoczesna FirmaNowoczesna Firma
Nowoczesna Firma
 
Marketing w wyszukiwarkach 2015 - raport Interaktywnie.com
Marketing w wyszukiwarkach  2015 - raport Interaktywnie.comMarketing w wyszukiwarkach  2015 - raport Interaktywnie.com
Marketing w wyszukiwarkach 2015 - raport Interaktywnie.com
 
Dzielenie się wiedzą – jako przykład (nie
Dzielenie się wiedzą – jako przykład (nieDzielenie się wiedzą – jako przykład (nie
Dzielenie się wiedzą – jako przykład (nie
 
Red Hat Linux 8. Biblia
Red Hat Linux 8. BibliaRed Hat Linux 8. Biblia
Red Hat Linux 8. Biblia
 
Wentylacja pomieszczeń - wpływ na jakość powietrza
Wentylacja pomieszczeń - wpływ na jakość powietrzaWentylacja pomieszczeń - wpływ na jakość powietrza
Wentylacja pomieszczeń - wpływ na jakość powietrza
 
1.ins znrow14
1.ins znrow141.ins znrow14
1.ins znrow14
 
Napędza nas czysta energia
Napędza nas czysta energiaNapędza nas czysta energia
Napędza nas czysta energia
 
Scalone dokumenty (32)
Scalone dokumenty (32)Scalone dokumenty (32)
Scalone dokumenty (32)
 
Oscylatory i ich praktyczne zastosowanie
Oscylatory i ich praktyczne zastosowanie Oscylatory i ich praktyczne zastosowanie
Oscylatory i ich praktyczne zastosowanie
 
Odpowiedzialność administracyjna w obrocie instrumentami finansowymi - ebook
Odpowiedzialność administracyjna w obrocie instrumentami finansowymi - ebookOdpowiedzialność administracyjna w obrocie instrumentami finansowymi - ebook
Odpowiedzialność administracyjna w obrocie instrumentami finansowymi - ebook
 
Social Media Optimisation, ROI i KPI 2012/2012
Social Media Optimisation, ROI i KPI 2012/2012Social Media Optimisation, ROI i KPI 2012/2012
Social Media Optimisation, ROI i KPI 2012/2012
 
Kryzys jugosłowiański
Kryzys jugosłowiańskiKryzys jugosłowiański
Kryzys jugosłowiański
 
Zdrowy styl życia 2013. Cyfrowy raport syndykatowy
Zdrowy styl życia 2013. Cyfrowy raport syndykatowy Zdrowy styl życia 2013. Cyfrowy raport syndykatowy
Zdrowy styl życia 2013. Cyfrowy raport syndykatowy
 

Similar to PHP5. Profesjonalne tworzenie oprogramowania

Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowaneWydawnictwo Helion
 
PHP i MySQL. Tworzenie stron WWW. Wydanie drugie. Vademecum profesjonalisty
PHP i MySQL. Tworzenie stron WWW. Wydanie drugie. Vademecum profesjonalistyPHP i MySQL. Tworzenie stron WWW. Wydanie drugie. Vademecum profesjonalisty
PHP i MySQL. Tworzenie stron WWW. Wydanie drugie. Vademecum profesjonalistyWydawnictwo Helion
 
PHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki startPHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki startWydawnictwo Helion
 
PHP, MySQL i Apache dla każdego. Wydanie III
PHP, MySQL i Apache dla każdego. Wydanie IIIPHP, MySQL i Apache dla każdego. Wydanie III
PHP, MySQL i Apache dla każdego. Wydanie IIIWydawnictwo Helion
 
Delphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danychDelphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danychWydawnictwo Helion
 
PHP i MySQL. Aplikacje bazodanowe
PHP i MySQL. Aplikacje bazodanowePHP i MySQL. Aplikacje bazodanowe
PHP i MySQL. Aplikacje bazodanoweWydawnictwo Helion
 
Delphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneDelphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneWydawnictwo Helion
 
PHP, MySQL i Apache dla każdego. Wydanie II
PHP, MySQL i Apache dla każdego. Wydanie IIPHP, MySQL i Apache dla każdego. Wydanie II
PHP, MySQL i Apache dla każdego. Wydanie IIWydawnictwo Helion
 
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie IIPHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie IIWydawnictwo Helion
 
Serwisy internetowe. Programowanie
Serwisy internetowe. ProgramowanieSerwisy internetowe. Programowanie
Serwisy internetowe. ProgramowanieWydawnictwo Helion
 
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsVisual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 

Similar to PHP5. Profesjonalne tworzenie oprogramowania (19)

PHP5. Księga eksperta
PHP5. Księga ekspertaPHP5. Księga eksperta
PHP5. Księga eksperta
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowane
 
PHP5. Praktyczny kurs
PHP5. Praktyczny kursPHP5. Praktyczny kurs
PHP5. Praktyczny kurs
 
PHP i MySQL. Tworzenie stron WWW. Wydanie drugie. Vademecum profesjonalisty
PHP i MySQL. Tworzenie stron WWW. Wydanie drugie. Vademecum profesjonalistyPHP i MySQL. Tworzenie stron WWW. Wydanie drugie. Vademecum profesjonalisty
PHP i MySQL. Tworzenie stron WWW. Wydanie drugie. Vademecum profesjonalisty
 
PHP. Praktyczne wprowadzenie
PHP. Praktyczne wprowadzeniePHP. Praktyczne wprowadzenie
PHP. Praktyczne wprowadzenie
 
PHP. Programowanie
PHP. ProgramowaniePHP. Programowanie
PHP. Programowanie
 
PHP w mgnieniu oka
PHP w mgnieniu okaPHP w mgnieniu oka
PHP w mgnieniu oka
 
PHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki startPHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki start
 
Python. Od podstaw
Python. Od podstawPython. Od podstaw
Python. Od podstaw
 
PHP, MySQL i Apache dla każdego. Wydanie III
PHP, MySQL i Apache dla każdego. Wydanie IIIPHP, MySQL i Apache dla każdego. Wydanie III
PHP, MySQL i Apache dla każdego. Wydanie III
 
Delphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danychDelphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danych
 
Spring. Zapiski programisty
Spring. Zapiski programistySpring. Zapiski programisty
Spring. Zapiski programisty
 
PHP i MySQL. Aplikacje bazodanowe
PHP i MySQL. Aplikacje bazodanowePHP i MySQL. Aplikacje bazodanowe
PHP i MySQL. Aplikacje bazodanowe
 
Delphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneDelphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowane
 
PHP, MySQL i Apache dla każdego. Wydanie II
PHP, MySQL i Apache dla każdego. Wydanie IIPHP, MySQL i Apache dla każdego. Wydanie II
PHP, MySQL i Apache dla każdego. Wydanie II
 
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie IIPHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
 
Serwisy internetowe. Programowanie
Serwisy internetowe. ProgramowanieSerwisy internetowe. Programowanie
Serwisy internetowe. Programowanie
 
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsVisual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
 
Delphi 2005
Delphi 2005Delphi 2005
Delphi 2005
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

PHP5. Profesjonalne tworzenie oprogramowania

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TREŒCI PHP5. Profesjonalne tworzenie oprogramowania KATALOG KSI¥¯EK Autor: Sebastian Bergmann T³umaczenie: Wojciech Moch KATALOG ONLINE ISBN: 83-246-0069-8 Tytu³ orygina³u: Professionelle ZAMÓW DRUKOWANY KATALOG Softwareentwicklung mit PHP 5 Format: B5, stron: 208 TWÓJ KOSZYK Kolejna wersja popularnego jêzyka PHP wnios³a zupe³nie now¹ jakoœæ do tworzenia DODAJ DO KOSZYKA aplikacji internetowych. PHP5 to w pe³ni obiektowe œrodowisko, pozwalaj¹ce na korzystanie z wszystkich nowoczesnych technologii sieciowych i budowanie wydajnych oraz, co najwa¿niejsze, bezpiecznych systemów. Przed twórcami aplikacji otwar³y siê CENNIK I INFORMACJE bramy do protoko³u SOAP, us³ug sieciowych, ogromnych mo¿liwoœci jêzyka XML i znacznie wydajniejszych po³¹czeñ z bazami danych. ZAMÓW INFORMACJE Ksi¹¿ka „PHP5. Profesjonalne tworzenie oprogramowania” jest przeznaczona w³aœnie O NOWOŒCIACH dla takich programistów -- tych, którzy opanowali poprzednie wersje PHP i chc¹ poznaæ mo¿liwoœci, jakie oferuje jego najnowsze wcielenie. Przedstawia tajniki projektowania ZAMÓW CENNIK i programowania obiektowego, ze szczególnym uwzglêdnieniem stosowania wzorców projektowych i testowania za pomoc¹ biblioteki PHPUnit. Opisuje mo¿liwoœci zastosowania w aplikacjach PHP jêzyka XML, protoko³u SOAP i zaawansowanych CZYTELNIA technik operowania na bazach danych. Czytaj¹c j¹, poznasz równie¿ metody automatycznego dokumentowania kodu oraz modelowania aplikacji za pomoc¹ FRAGMENTY KSI¥¯EK ONLINE jêzyka UML i dostêpnych bezp³atnie narzêdzi ArgoUML i Poseidon for UML. • Klasy i obiekty • Serializacja obiektów • Mechanizmy dziedziczenia • Korzystanie z biblioteki PHPUnit do testowania aplikacji • Stosowanie wzorców projektowych • Wzorce konstrukcyjne i strukturalne oraz wzorce zachowañ • Obs³uga jêzyka XML w PHP5 • Tworzenie us³ug sieciowych • Wykorzystywanie mo¿liwoœci rozszerzenia MySQL • Komunikacja z bazami danych za pomoc¹ Creole i Propel Wydawnictwo Helion • Tworzenie dokumentacji kodu z wykorzystaniem narzêdzia phpDocumentator ul. Chopina 6 • Modelowanie aplikacji w jêzyku UML 44-100 Gliwice Wykorzystaj najnowsz¹ wersjê PHP5 tel. (32)230-98-63 do stworzenia szybkich i bezpiecznych aplikacji internetowych e-mail: helion@helion.pl
  • 2. Spis treści O autorze .......................................................................................................................... 9 Słowo wstępne ............................................................................................................... 11 Wprowadzenie ................................................................................................................ 13 Część I Programowanie zorientowane obiektowo ........................17 Rozdział 1. Podstawy ....................................................................................... 19 1.1. Wprowadzenie ....................................................................................................... 19 1.2. Motywacja ............................................................................................................. 19 1.3. Klasy i obiekty ....................................................................................................... 21 1.4. Polimorfizm ........................................................................................................... 25 1.5. Referencje .............................................................................................................. 26 1.6. Metody klasy, zmienne klasy i stałe klasy ............................................................. 29 1.7. Konstruktory i destruktory ..................................................................................... 30 1.8. Dziedziczenie ........................................................................................................ 32 1.9. Klasy abstrakcyjne i interfejsy ............................................................................... 35 1.10. Obsługiwanie błędów z wykorzystaniem wyjątków .............................................. 38 1.11. Serializacja obiektów ............................................................................................. 43 1.12. Reflection API ....................................................................................................... 45 1.13. Migracja z PHP4 do PHP5 .................................................................................... 47 Rozdział 2. Metody przechwytujące .................................................................. 49 2.1. Wprowadzenie ....................................................................................................... 49 2.2. Funkcja __autoload() ............................................................................................. 50 2.3. Metoda __get() ...................................................................................................... 51 2.4. Metoda __set() ....................................................................................................... 51 2.5. Metoda __call() ..................................................................................................... 53 2.6. Metoda __toString() .............................................................................................. 55 Rozdział 3. Iteratory ......................................................................................... 57 3.1. Wprowadzenie ....................................................................................................... 57 3.2. Interfejsy iteratorów w PHP5 ................................................................................ 59 3.3. Biblioteka standardowa PHP (SPL) ....................................................................... 62 3.4. Interfejs ArrayAccess ............................................................................................ 65 Rozdział 4. Tworzenie aplikacji ukierunkowane na testowanie z wykorzystaniem biblioteki PHPUnit ............................................... 69 4.1. Wprowadzenie ....................................................................................................... 69 4.2. Przypadki testowe i zapewnienia ........................................................................... 72 4.3. Wykonywanie i ocenianie przypadków testowych ................................................... 75
  • 3. 6 PHP5. Profesjonalne tworzenie oprogramowania 4.4. Automatyczne generowanie klas przypadków testowych ...................................... 78 4.5. Analiza pokrycia kodu dla aplikacji PHP .............................................................. 80 4.6. TestDox ................................................................................................................. 81 Część II Stosowanie wzorców projektowych w PHP .....................83 Rozdział 5. Wzorce konstrukcyjne ..................................................................... 85 5.1. Wprowadzenie ....................................................................................................... 85 5.2. Fabryka abstrakcyjna ............................................................................................. 85 5.3. Singleton ................................................................................................................ 88 Rozdział 6. Wzorce strukturalne ....................................................................... 91 6.1. Wprowadzenie ....................................................................................................... 91 6.2. Dekorator ............................................................................................................... 91 6.3. Pośrednik ............................................................................................................... 94 Rozdział 7. Wzorce zachowań ........................................................................... 97 7.1. Wprowadzenie ....................................................................................................... 97 7.2. Obserwator ............................................................................................................ 97 7.3. Metoda szablonu .................................................................................................. 102 7.4. Strategia ............................................................................................................... 105 7.5. Iterator ................................................................................................................. 108 Część III Programowanie w PHP5 ...............................................109 Rozdział 8. Obsługa XML w PHP ..................................................................... 111 8.1. Wprowadzenie ..................................................................................................... 111 8.2. SimpleXML ......................................................................................................... 112 8.3. Simple API for XML (SAX) ............................................................................... 117 8.4. Document Object Model (DOM) ......................................................................... 120 8.5. Transformacje XSL (XSLT) ................................................................................ 128 8.6. Przenoszenie obiektów do sieci WWW za pomocą biblioteki XML_Transformer ..................................................................132 Rozdział 9. Usługi WWW korzystające z SOAP ................................................. 141 9.1. Wprowadzenie ..................................................................................................... 141 9.2. Programowanie usług sieciowych......................................................................... 142 9.3. Stosowanie usługi WWW..................................................................................... 145 Rozdział 10. Rozszerzenie MySQLi .................................................................... 147 10.1. Wprowadzenie ..................................................................................................... 147 10.2. Obiektowe wykorzystanie rozszerzenia MySQLi ................................................ 147 10.3. Stosowanie wstępnie przygotowanych zapytań ................................................... 150 10.4. Proceduralne korzystanie z rozszerzenia MySQLi .............................................. 152 Część IV Zaawansowane programowanie baz danych .................153 Rozdział 11. Creole .......................................................................................... 155 11.1. Wprowadzenie ..................................................................................................... 155 11.2. Połączenie z bazą danych .................................................................................... 156 11.3. Wykonywanie zapytań SQL ................................................................................ 157 11.4. Metadane ............................................................................................................. 162
  • 4. Spis treści 7 Rozdział 12. Propel .......................................................................................... 163 12.1. Wprowadzenie ..................................................................................................... 163 12.2. Określanie modelu danych za pomocą XML ....................................................... 164 12.3. Model obiektów i pamięć obiektów ..................................................................... 169 12.4. Szukanie obiektów w pamięci obiektów .............................................................. 172 Część V Narzędzia do tworzenia projektów w PHP .....................175 Rozdział 13. Dokumentacja kodu ...................................................................... 177 13.1. Wprowadzenie ..................................................................................................... 177 13.2. phpDocumentator ................................................................................................ 177 13.3. Doxygen .............................................................................................................. 181 Rozdział 14. Modelowanie w językach UML i MDA ............................................ 185 14.1. Wprowadzenie ..................................................................................................... 185 14.2. Programy ArgoUML i Poseidon for UML .......................................................... 186 14.3. UML2PHP ........................................................................................................... 189 Dodatki ......................................................................................193 Dodatek A Instalowanie Apache 2.0, MySQL 4.1 i PHP 5.0 ............................. 195 Dodatek B Literatura ..................................................................................... 197 Dodatek C Słowniczek ................................................................................... 199 Skorowidz ..................................................................................... 201
  • 5. Rozdział 8. Obsługa XML w PHP „XML to gigantyczny krok naprzód, w zupełnie żadnym kierunku”. Eric Naggum 8.1. Wprowadzenie W związku z cały czas rosnącą popularnością języka XML1 (eXtensible Markup Language), w PHP5 wprowadzona została przygotowana od podstaw obsługa ję- zyka XML. W PHP4 standardowa instalacja pakietu była już wyposażona w ste- rowane zdarzeniami mechanizmy obsługi XML, bazujące na bibliotece Expat. Z kolei w standardowej instalacji PHP5 udostępnione zostały znacznie bardziej rozbudowane mechanizmy obsługi dokumentów XML, bazujące na bibliotekach libxml2 i libxslt pochodzących z projektu GNOME. Rozszerzenie SimpleXML pozwala na bardzo prostą obsługę dokumentów XML. Rozszerzenie XML umożliwia obsługę dokumentów XML sterowaną zdarzeniami, zgodną z Simple Api for XML (SAX)2, i w związku z tym jest zgodne z opartą na bibliotece Expat obsługą dokumentów XML, stosowaną w PHP4. Rozszerzenie DOM implementuje standard DOM (Document Object Model)3, przez co pozwala na obiektową obsługę dokumentów XML reprezentowanych w postaci struktury drzewiastej. 1 http://www.w3.org/XML/ 2 http://www.saxproject.org/ 3 http://www.w3.org/DOM/
  • 6. 112 Część III ♦ Programowanie w PHP5 Rozszerzenie XSLT udostępnia wszystkie funkcje konieczne do transformowania dokumentów zgodnie ze standardem XSL (eXtensible Stylesheet Language)4. 8.2. SimpleXML Do prostej obsługi dokumentów XML PHP udostępnia interfejs programistyczny SimpleXML. Interfejs ten opiera się na idei pakietu języka Perl o nazwie XML: :Simple i w związku z tym pozwala na intuicyjny dostęp do danych zapisanych w dokumencie XML. 8.2.1. Ładowanie i zapisywanie dokumentów XML Funkcje simplexml_load_file() i simplexml_load_string() tworzą obiekt klasy SimpleXMLElement przeznaczony do obsługi danych XML, które w zależności od użytej funkcji ładowane są ze wskazanego pliku lub ciągu znaków. Metoda asXML($filename) zwraca dane istniejącego obiektu SimpleXMLElement w formacie XML i może je ewentualnie zapisać do wskazanego pliku. 8.2.2. Klasa SimpleXMLElement Obiekt klasy SimpleXMLElement (jej diagram UML przedstawiony został na ry- sunku 8.1) przechowuje po jednej zmiennej egzemplarza dla każdego podrzędnego elementu w strukturze XML. Każda taka zmienna otrzymuje nazwę opisującą dany element XML (proszę przyjrzeć się rysunkowi 8.2). Jeżeli dany element pod- rzędny występuje w strukturze tylko raz, to zmienna egzemplarza przechowuje wartość tego elementu. Jeżeli jednak dany element podrzędny występuje w struk- turze wielokrotnie (tak jak element <book> na listingu 8.1), to zmienna egzempla- rza przechowywać będzie tablicę5 obiektów SimpleXMLElement opisujących każdy z elementów podrzędnych. 4 http://www.w3.org/Style/XSL/ 5 Funkcje tablicowe PHP nie będą jednak współpracowały z taką tablicą, a wywołanie is_array($books->book[1]->author) zwróci wartość FALSE. Mimo to zawarte w PHP funkcje debugowania print_r() i var_dump() będą traktować zapis $books->book[1]-> author jako tablicę.
  • 7. Rozdział 8. ♦ Obsługa XML w PHP 113 Rysunek 8.1. Klasa Simple- XMLElement Rysunek 8.2. Reprezentacja plików XML w obiektach typu SimpleXML- Element <?xml version="1.0" encoding="iso-8859-2" ?> Listing 8.1. <!DOCTYPE books PUBLIC "books" "books.dtd"> Katalog książek <books> w formacie <book lang="pl"> XML <author>Sebastian Bergmann</author> <title>Profesjonalne tworzenie oprogramowania w PHP 5</title> <isbn>83-246-0069-8</isbn> </book>
  • 8. 114 Część III ♦ Programowanie w PHP5 <book lang="de"> <author>Emilian Balanescu</author> <author>Mihai Bucica</author> <author>Cristian Darie</author> <title>PHP5 i MySQL. Zastosowania e-commerce</title> <isbn>83-7361-830-9</isbn> </book> </books> Obiekt klasy SimpleXMLElement wyposażony jest w implementację metody prze- chwytującej __toString (była o niej mowa w podrozdziale 2.6), dlatego możliwe jest odczytanie tekstowej reprezentacji każdego elementu XML (CDATA), na przykład za pośrednictwem instrukcji print. Na listingu 8.2 przedstawiony został sposób odczytywania ze struktury XML zawartości elementu title z pierwszego ele- mentu book. Listing 8.2. <?php Dostęp $books = simplexml_load_file('books.xml'); do elementu XML print $books->book[0]->title; za pomocą ?> interfejsu SimpleXML Profesjonalne tworzenie oprogramowania w PHP 5 W obiektach SimpleXMLElement metoda attributes() zwraca tablicę asocjacyjną ze wszystkimi atrybutami danego elementu XML. Przykład wykorzystania tej metody przedstawiony został na listingu 8.3. Listing 8.3. <?php Dostęp $books = simplexml_load_file('books.xml'); do atrybutów elementu foreach ($books->book[0]->attributes() as $nazwa=>$wartosc) { XML poprzez print "$nazwa: $wartoscn"; interfejs } SimpleXML ?> lang: pl Klasa SimpleXMLElement implementuje również interfejs iteratora Traversable (oma- wiany był w rozdziale 3.). Dzięki temu obiekt typu SimpleXMLElement może być dowolnie iterowany za pomocą operatora foreach (i jednocześnie można obsługiwać zawarte w nim dane dokumentu XML), tak jak na listingu 8.4. Listing 8.4. <?php Dostęp $books = simplexml_load_file('books.xml'); do katalogu książek foreach ($books->book as $ksiazka) { za pomocą $autorzy = ''; interfejsu SimpleXML foreach ($ksiazka->author as $autor) { i operatora foreach $autorzy .= empty($autorzy) ? $autor : ', ' . $autor; } printf( "%s: "%s"nISBN: %snn",
  • 9. Rozdział 8. ♦ Obsługa XML w PHP 115 $autorzy, $ksiazka->title, $ksiazka->isbn ); } ?> Sebastian Bergmann: "Profesjonalne tworzenie oprogramowania w PHP 5" ISBN: 83-246-0069-8 Emilian Balanescu, Mihai Bucica, Cristian Darie: "PHP5 i MySQL. Zastosowania e-commerce" ISBN: 83-7361-830-9 Zawartość obiektów SimpleXMLElement może zostać zmieniona przez odpowied- nie modyfikacje odpowiednich zmiennych egzemplarza, tak jak na listingu 8.5. <?php Listing 8.5. $books = simplexml_load_file('books.xml'); Zmiana $books->book[0]->author = 'Johannes Sebastian Bergmann'; zawartości obiektu print $books->book[0]->asXML(); Simple- ?> XMLElement i wypisanie <book lang="pl"> danych XML <author>Johannes Sebastian Bergmann</author> <title>Profesjonalne tworzenie oprogramowania w PHP 5</title> <isbn>83-246-0069-8</isbn> </book> Korzystając w obiekcie SimpleXMLElement z metody xpath(), można tworzyć za- XPath pytania w języku XML Path Language (XPath)6. Na listingu 8.6 zostało przed- stawione zapytanie zwracające tytuły wszystkich książek zapisanych w katalogu. Wynikiem takich zapytań jest zawsze tablica obiektów typu SimpleXMLElement. <?php Listing 8.6. $books = simplexml_load_file('books.xml'); Zastosowanie języka XPath foreach ($books->xpath('book/title') as $tytul) { w interfejsie print "$tytuln"; SimpleXML } ?> Profesjonalne tworzenie oprogramowania w PHP 5 PHP 5 8.2.3. Klasa SimpleXMLIterator W bibliotece standardowej PHP (była o niej mowa w rozdziale 3.) dostępna jest też pewna alternatywa dla klasy SimpleXMLElement, pozwalająca na obsługę do- kumentów XML za pomocą interfejsu SimpleXML — klasa SimpleXMLIterator. 6 http://www.w3.org/TR/xpath
  • 10. 116 Część III ♦ Programowanie w PHP5 Klasa SimpleXMLIterator udostępnia interfejs RecursiveIterator i dlatego może przeglądać wszystkie elementy dokumentu XML, korzystając przy tym z dodat- kowego iteratora typu RecursiveIteratorIterator. Na listingu 8.7 wywoływana jest funkcja simplexml_load_file(), której podawany jest opcjonalny drugi parametr, przez co w wyniku swojego działania funkcja ta, zamiast obiektu SimpleXMLElement, zwraca obiekt typu SimpleXMLIterator. Następ- nie tworzony jest obiekt typu RecursiveIteratorIterator obsługujący obiekt SimpleXMLIterator. Przy użyciu tego iteratora, w wyniku podania dodatkowego parametru RIT_SELF_FIRST, wypisywane są wszystkie elementy XML z elementem podstawowym (root) włącznie. Listing 8.7. <?php Rekursywne $dokument = simplexml_load_file( wyliczanie 'books.xml', wszystkich 'SimpleXMLIterator' elementów ); dokumentu XML $iterator = new RecursiveIteratorIterator( $dokument, RIT_SELF_FIRST ); foreach($iterator as $nazwa => $element) { print $nazwa . "n"; } ?> book author title isbn book author author author title isbn Wewnątrz pętli foreach z listingu 8.7 zmienna $nazwa przechowuje nazwę aktu- alnego elementu XML, natomiast w zmiennej $element zapisywany jest obiekt opisujący ten element. 8.2.4. Wady i zalety Zaleta: Bardzo prosty dostęp do elementów XML. Zaleta: Niewielkie zapotrzebowanie na pamięć, ponieważ obiekty PHP tworzone są tylko w razie potrzeby, a sam dokument początkowo zapisany jest tylko raz (w pamięci biblioteki libxml2). Zaleta: Prędkość działania. Wada: Utrudniony dostęp do atrybutów elementów XML. Wada: Brak standardu.
  • 11. Rozdział 8. ♦ Obsługa XML w PHP 117 8.3. Simple API for XML (SAX) W czasie obsługi danych XML za pomocą Simple API for XML (SAX) parser Orientacja XML wywołuje określone zdarzenia (otwierający znacznik elementu, zamykający na zdarzenia znacznik elementu itp.), które muszą być obsłużone przez programistę w ramach specjalnych metod lub funkcji. Najpierw przyjrzymy się trzem najważniejszym zdarzeniom wykorzystywanym w trakcie przetwarzania danych XML: „Start Element”, „End Element” i „Cha- racter Data”. xml_set_element_handler($parser, <start_element_handler>, <end_element_handler>) — Rejestruje funkcje wywołań zwrotnych dla zdarzeń „Start Element” i „End Element”. Funkcja lub metoda obsługująca zdarzenie „Start Element” musi przyjmować trzy parametry: $parser, $name i $attributes. Ostatni z tych parametrów zawiera tablicę asocjacyjną z atrybutami elementu XML. Funkcja lub metoda obsługująca zdarzenie „End Element” musi przyjmować dwa parametry: $parser i $name. xml_set_character_data_handler($parser, <handler>) — Rejestruje funkcję wywołań zwrotnych dla zdarzenia „Character Data”. Funkcja lub metoda, która ma obsługiwać to zdarzenie, musi przyjmować dwa parametry: $paser i $cdata. W czasie rejestrowania funkcji wywołania zwrotnego (ang. callback) w parametrze <handler> można przekazać nazwę funkcji lub tablicy przechowującej referencję obiektu, a także nazwę metody tego obiektu, która ma obsługiwać dane zdarzenie. Na listingu 8.8 przedstawiony został sposób obsługi katalogu książek z listingu 8.1. <?php Listing 8.8. class Ksiazki { Dostęp protected $parser; do katalogu protected $stosElementow = array(); książek protected $autorzy = array(); poprzez interfejs SAX public function __construct() { $this->parser = xml_parser_create(); xml_set_object($this->parser, $this); xml_set_element_handler( $this->parser, 'startElement', 'endElement' ); xml_set_character_data_handler( $this->parser, 'characterData' );
  • 12. 118 Część III ♦ Programowanie w PHP5 xml_set_default_handler( $this->parser, 'characterData' ); } public function __destruct() { xml_parser_free($this->parser); } public function odczytajKatalog($katalog) { xml_parse( $this->parser, file_get_contents($katalog), TRUE ); } protected function startElement($parser, $element, $attributes) { array_push($this->stosElementow, $element); if ($element == 'BOOK') { $this->autorzy = array(); } } protected function endElement($parser, $element) { array_pop($this->stosElementow); } protected function characterData($parser, $cdata) { $poziom = sizeof($this->stosElementow) - 1; $element = $this->stosElementow[$poziom]; switch($element) { case 'AUTHOR': { $this->autorzy[] = $cdata; } break; case 'TITLE': { print implode(', ', $this->autorzy) . "n"; print $cdata . "n"; } break; case 'ISBN': { print 'ISBN: ' . $cdata . "nn"; } break; } } }
  • 13. Rozdział 8. ♦ Obsługa XML w PHP 119 $ksiazki = new Ksiazki; $ksiazki->odczytajKatalog('books.xml'); ?> Sebastian Bergmann Profesjonalne tworzenie oprogramowania w PHP5 ISBN: 83-246-0069-8 Emilian Balanescu, Mihai Bucica, Cristian Darie PHP5 i MySQL. Zastosowania e-commerce ISBN: 83-7361-830-9 Parser interfejsu SAX przetwarza dane dokumentu XML w sposób liniowy i w pamięci przechowuje tylko te dane, które związane są z bieżącym zda- rzeniem. Dlatego też programista musi się zajmować przechowywaniem danych aktualnie obsługiwanego elementu XML. W naszym przykładzie nazwę otwiera- nego właśnie znacznika XML zapisujemy na stosie. W metodzie obsługującej zdarzenie „Character Data” można dzięki temu stwierdzić, z którym elementem związane są aktualnie obsługiwane dane. W momencie gdy parser dotrze do za- mykającego znacznika XML, nazwę elementu można usunąć ze stosu. W interfejsie SAX obok zdarzeń „Start Element”, „End Element” i „Character Data” udostępniane są jeszcze następujące zdarzenia: xml_set_processing_instruction_handler($parser, <handler>) — rejestruje funkcję wywołania zwrotnego obsługującą zdarzenie „Processing Instruction”. xml_set_external_entity_ref_handler($parser, <handler>) — rejestruje funkcję wywołania zwrotnego obsługującą zdarzenie „External Entity Reference”. xml_set_notation_decl_handler($parser, <handler>) — rejestruje funkcję wywołania zwrotnego obsługującą zdarzenie „Notation Declaration”. xml_set_unparsed_entity_decl_handler($parser, <handler>) — rejestruje funkcję wywołania zwrotnego obsługującą zdarzenie „Unparsed Entity Declaration”. xml_set_default_handler($parser, <handler>) — rejestruje funkcję wywołania zwrotnego obsługującą wszystkie te zdarzenia, dla których nie została zarejestrowana metoda obsługi. 8.3.1. Wady i zalety Zaleta: Standard, choć niezatwierdzony przez konsorcjum WWW. Zaleta: Niewielkie użycie pamięci, ponieważ w danym momencie dostępny jest tylko aktualny element XML. Zaleta: Szybkość działania.
  • 14. 120 Część III ♦ Programowanie w PHP5 Wada: Praca liniowa, nie jest możliwy swobodny dostęp do elementów. Wada: Nie ma możliwości zapisu danych. Wada: Programista musi zajmować się wszystkimi szczegółami obsługi. 8.4. Document Object Model (DOM) Konsorcjum WWW (W3C)7 przygotowało bardzo potężny standard w postaci modelu DOM (Document Object Model), stanowiącego niezależny od platformy i języka programowania interfejs programistyczny przeznaczony do odczyty- wania i zapisywania danych w prawidłowych dokumentach HTML i prawi- dłowo zbudowanych dokumentach XML. PHP5 udostępnia własne rozszerzenie obsługi modelu DOM, które niestety nie jest zgodne z rozszerzeniem obsługi modelu DOM z PHP4. Rozszerzenie to jest pełną implementacją standardu DOM w wersji „Level 2 Core”, a dodatkowo za- wiera pewne elementy („Load and Save”) nowszej wersji „Level 3”. Węzły Model DOM zajmuje się wszystkimi elementami dokumentu XML, które traktowa- ne są jak węzły drzewa. Sam dokument (DOMDocument), jego elementy (DOMElements), a także ich atrybuty (DOMAttr) oraz tekstowa zawartość (DOMText) reprezentowane są przez obiekty odpowiednich klas węzłów, które powiązane są ze sobą za po- mocą referencji. Na rysunku 8.3 przedstawione zostało drzewo obiektów DOM utworzone na podstawie dokumentu XML prezentowanego na listingu 8.1. Rysunek 8.3. Reprezentacja struktury katalogu książek w postaci struktury DOM 7 http://www.w3.org/
  • 15. Rozdział 8. ♦ Obsługa XML w PHP 121 Implementacja modelu DOM w PHP5 obejmuje 29 klas w sumie zawierających 360 metod. W tym miejscu zajmiemy się najważniejszymi z nich (przedstawione zostały w tabeli 8.1). Tabela 8.1. Klasa bazowa Klasa Zadanie Najważniejsze lub interfejs klasy modelu DOMNode DOM Klasa bazowa dla pozostałych klas węzłów drzewa DOM. DOMDocument DOMNode Stanowi punkt wejścia do drzewa DOM. DOMElement DOMNode Reprezentuje element XML i udostępnia metody dostępu do elementów XML. DOMAttr DOMNode Reprezentuje atrybut elementu XML. DOMCharacterData DOMNode Reprezentuje część danych tekstowych elementu XML. DOMText DOMCharacterData Reprezentuje tekstowe zawartości dokumentu XML. DOMNodeList Traversable Reprezentuje zbiór węzłów. DOMXPath Umożliwia formułowanie zapytań XPath. DOMException Exception Klasa wyjątku. 8.4.1. Ładowanie i zapisywanie dokumentów XML Metoda DOMDocument::load($filename) przeznaczona jest do odczytywania do- kumentu XML ze wskazanego pliku i może być wywoływana zarówno na rzecz konkretnego obiektu, jak i statycznie na rzecz klasy. Jeżeli wywoływana jest statycz- nie, to zwraca w wyniku swojego działania obiekt klasy DOMDocument (przykład takiego działania znaleźć można na listingu 8.12). Z kolei metoda DOMDocument: :loadXML($xml) pozwala na załadowanie dokumentu XML z ciągu znaków, natomiast funkcja dom_import_simplexml($sxe) tworzy nowy obiekt klasy DOM- Document na podstawie obiektu klasy SimpleXMLElement. Podobnie metody DOMDocument::loadHTMLFile($filename) i DOMDocument::loadHTML ($html) pozwalają na załadowanie dokumentu HTML z pliku lub ciągu znaków. Metody DOMDocument::save($filename) i DOMDocument::saveXML() przeznaczone są do zapisywania dokumentu XML we wskazanym pliku lub ciągu znaków. Do obsługi zapisu dokumentów HTML przygotowane zostały metody DOMDocument: :saveHTMLFile($filename) i DOMDocument::saveHTML(). Wszystkie wymienione metody wykorzystują system strumieni funkcjonujący Strumienie w PHP5. Tym samym w zależności od tego, która wersja obsługi strumieni zo- stanie wkompilowana do projektu, metody te mogą na przykład otworzyć plik XML
  • 16. 122 Część III ♦ Programowanie w PHP5 ze zdalnego serwera albo zapisać dokument XML na serwerze FTP. W takich przypadkach zamiast nazwy pliku w parametrze $filename należy podać od- powiedni adres URL. 8.4.2. Tworzenie nowego dokumentu XML Na listingu 8.9 najpierw tworzony jest obiekt klasy DOMDocument. Konstruktorowi tej klasy przekazywana jest żądana wersja standardu XML ("1.0") oraz stosowa- ne w dokumencie kodowanie znaków ("iso-8859-2"). Listing 8.9. <?php Tworzenie $dokument = new DOMDocument('1.0', 'iso-8859-2'); nowego $dokument->formatOutput = TRUE; dokumentu XML $ksiazki = $dokument->appendChild( $dokument->createElement('books') ); $ptop5 = $ksiazki->appendChild( $dokument->createElement('book') ); $ptop5->setAttribute('lang', 'pl'); $ptop5->appendChild( $dokument->createElement( 'author', 'Sebastian Bergmann' ) ); $ptop5->appendChild( $document->createElement( 'title', 'Profesjonalne tworzenie oprogramowania w PHP 5' ) ); $ptop5->appendChild( $dokument->createElement( 'isbn', '83-246-0069-8' ) ); print $dokument->saveXML(); ?> <?xml version="1.0" encoding="iso-8859-2" ?> <books> <book lang="pl"> <author>Sebastian Bergmann</author> <title>Profesjonalne tworzenie oprogramowania w PHP 5</title> <isbn>83-246-0069-8</isbn> </book> </books>
  • 17. Rozdział 8. ♦ Obsługa XML w PHP 123 Metoda DOMDocument::createElement() tworzy nowy obiekt klasy DOMElement, z kolei za pomocą metody DOMNode::appendChild() można „podwiesić” utworzony element w odpowiednim miejscu w drzewie DOM. Tworzenie nowego dokumentu XML za pomocą klas modelu DOM, tak jak przed- stawione to zostało na listingu 8.9, może okazać się zadaniem wyjątkowo praco- chłonnym. W takich przypadkach dobrze jest przygotować zestaw klas rozbudowu- jących klasy modelu DOM poprzez dziedziczenie i dopasować je do potrzeb aktualnej aplikacji. Klasa Book (prezentowana na listingu 8.10) rozbudowuje klasę DOMElement o me- tody setAuthor($author), setISBN($isbn), setLanguage($language) i setTitle ($title), ściśle powiązane z elementem <book> w drzewie dokumentu XML. W ten sposób użytkownik tej klasy nie musi już samodzielnie wywoływać metod DOMDocument::createElement() i DOMNode::appendChild(). <?php Listing 8.10. class Book extends DOMElement { Klasa Book private $document; public function __construct(DOMDocument $document) { parent::__construct('book'); $this->document = $document; } public function setAuthor($author) { $this->appendChild( $this->document->createElement( 'author', $author ) ); } public function setISBN($isbn) { $this->appendChild( $this->document->createElement( 'isbn', $isbn ) ); } public function setLanguage($language) { $this->setAttribute('lang', $language); } public function setTitle($title) { $this->appendChild( $this->document->createElement( 'title', $title ) ); } } ?>
  • 18. 124 Część III ♦ Programowanie w PHP5 Klasa Books (prezentowana na listingu 8.11) rozbudowuje klasę DOMDocument, dodając do niej metodę createBook() pozwalającą w prosty sposób utworzyć element typu <book>. Listing 8.11. <?php Klasa Books require_once 'Book.php'; class Books extends DOMDocument { private $books; public function __construct() { parent::__construct('1.0', 'iso-8859-2'); $this->books = $this->appendChild( $this->createElement('books') ); $this->formatOutput = TRUE; } public function createBook() { $book = new Book($this); $this->books->appendChild($book); return $book; } } $books = new Books; $book = $books->createBook(); $book->setAuthor('Sebastian Bergmann'); $book->setISBN('83-246-0069-8'); $book->setTitle( 'Profesjonalne tworzenie oprogramowania w PHP 5' ); $book->setLanguage('pl'); print $books->saveXML(); ?> Jak można się domyślić, kod z listingu 8.11 tworzy dokładnie taki sam dokument jak kod z listingu 8.9. 8.4.3. Wykorzystywanie klasy DOMNodeList Klasa DOMNodeList reprezentuje zbiór węzłów, czyli obiektów klasy DOMNode. Wę- zły w takim zbiorze nie są układane według żadnej konkretnej reguły. W klasie DOMNodeList implementowany jest interfejs Traversable (była o nim mowa w roz- dziale 3.), dlatego możliwe jest iterowanie przez poszczególne obiekty listy z wy- korzystaniem operatora foreach.
  • 19. Rozdział 8. ♦ Obsługa XML w PHP 125 Na listingu 8.12 korzystamy z metody DOMDocument::getElementsByTagName(), aby w ten sposób uzyskać listę wszystkich elementów typu <author>. W wyniku swo- jego działania metoda ta zwraca obiekt klasy DOMNodeList, w którym zawarte są odpowiednie obiekty typu DOMElement. Następnie za pomocą zapisu $author-> nodeValue odczytywane są wartości węzłów typu DOMText, które dołączone są do obiektów typu DOMElement zawartych w zmiennej $autor. <?php Listing 8.12. $dokument = DOMDocument::load('books.xml'); Zastosowanie $autorzy = $dokument->getElementsByTagName('author'); klasy DOMNodeList foreach ($autorzy as $autor) { print $autor->nodeValue . "n"; } ?> Sebastian Bergmann Emilian Balanescu Mihai Bucica Cristian Darie 8.4.4. Formułowanie zapytań XPath Za pomocą klasy DOMXPath można tworzyć zapytania XPath dotyczące drzewa XPath DOM. Wynikiem takiego zapytania zawsze jest obiekt klasy DOMNodeList. Przykład zastosowania tej klasy przedstawiony został na listingu 8.13. <?php Listing 8.13. $dokument = DOMDocument::load('books.xml'); Formułowanie $xpath = new DOMXPath($dokument); zapytań XPath foreach ($xpath->query('book/title') as $tytul) { print $tytul->nodeValue . "n"; } ?> Profesjonalne tworzenie oprogramowania w PHP 5 PHP5 i MySQL. Zastosowania e-commerce 8.4.5. Sprawdzanie poprawności dokumentów XML Rozszerzenie PHP-DOM obok obsługi i tworzenia dokumentów XML pozwala kontrolować zgodność dokumentów XML ze specyfikacjami zapisanymi w for- matach DTD (Document Type Definition), XSD (XML Schema) lub RNG (Re- laxNG).
  • 20. 126 Część III ♦ Programowanie w PHP5 XML Schema XML Schema8 jest oficjalnie zatwierdzoną przez W3C technologią zastępującą format Document Type Definition. Tworzone schematy stosowane są do definio- wania klas dokumentów XML. Na podstawie przygotowanego schematu można skontrolować, czy konkretny dokument XML spełnia założenia takiego schematu. Taki proces nazywany jest sprawdzaniem zgodności (ang. validate) dokumentu XML ze schematem. Na listingu 8.14 zastosowana została metoda DOMDocument::schemaValidate() udo- stępniana przez PHP5. W tym prostym programie kontrolowana jest zgodność dokumentu books.xml ze schematem XML zapisanym w pliku books.xsd (zawar- tość tego pliku prezentowana jest na listingu 8.15). Listing 8.14. <?php Kontrola $dokument = DOMDocument::load('books.xml'); zgodności ze schema- if ($dokument->schemaValidate('books.xsd')) { tem XML print 'Plik books.xml jest zgodny z deklaracją schematu '. 'zapisaną w pliku books.xsd.'; } ?> Plik books.xml jest zgodny z deklaracją schematu zapisaną w pliku books.xsd. Listing 8.15. <?xml version="1.0"?> Plik schematu XML <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> przygoto- <xsd:element name="books"> wany dla <xsd:complexType> dokumentu <xsd:sequence> katalogu książek <xsd:element maxOccurs="unbounded" ref="book"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="book"> <xsd:complexType> <xsd:sequence> <xsd:element ref="author" minOccurs="1" maxOccurs="unbounded"/> <xsd:element ref="title" minOccurs="1"/> <xsd:element ref="isbn" minOccurs="1"/> </xsd:sequence> <xsd:attribute name="lang" use="required" type="xsd:string"/> </xsd:complexType> </xsd:element> <xsd:element name="author" type="xsd:string"/> <xsd:element name="title" type="xsd:string"/> <xsd:element name="isbn" type="xsd:string"/> </xsd:schema> 8 http://www.w3.org/XML/Schema
  • 21. Rozdział 8. ♦ Obsługa XML w PHP 127 RelaxNG jest językiem schematów XML przeznaczonym do definiowania struktury RelaxNG dokumentów XML, funkcjonującym równolegle z językiem XML Schema. Język ten jest obecnie standaryzowany przez organizację ISO, ale nie jest wspierany przez konsorcjum W3C, choć wykorzystuje typy danych pochodzące z języka XML Schema. Najprawdopodobniej już wkrótce język RelaxNG stanie się alternatywą dla języka XML Schema, znacznie prostszą do poznania. Na listingu 8.16 przedstawiony został sposób wykorzystania metody DOMDocument: :relaxngValidate(). W tym prostym programie kontrolowana jest zgodność doku- mentu books.xml z definicją RelaxNG zapisaną w pliku books.rng (zawartość te- go pliku prezentowana jest na listingu 8.17). <?php Listing 8.16. $dokument = DOMDocument::load('books.xml'); Kontrola zgodności if ($dokument->relaxngValidate('books.rng')) { z definicją RelaxNG print 'Plik books.xml jest zgodny z deklaracją RelaxNG '. 'zapisaną w pliku books.rng.'; } ?> Plik books.xml jest zgodny z deklaracją RelaxNG zapisaną w pliku books.rng. <?xml version="1.0" encoding="UTF-8"?> Listing 8.17. Plik deklaracji <grammar xmlns="http://relaxng.org/ns/structure/1.0" RelaxNG datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> przygoto- <start> wany dla dokumentu <element name="books"> katalogu <oneOrMore> książek <element name="book"> <attribute name="lang"> <data type="NMTOKEN"/> </attribute> <oneOrMore> <element name="author"> <text/> </element> </oneOrMore> <element name="title"> <text/> </element> <element name="isbn"> <text/> </element> </element> </oneOrMore> </element> </start> </grammar>
  • 22. 128 Część III ♦ Programowanie w PHP5 8.4.6. Wady i zalety Zaleta: Implementacja potężnego standardu. Zaleta: Możliwość odczytywania i zapisywania danych dowolnego elementu XML. Wada: Powolne działanie i duże zapotrzebowanie na pamięć, ponieważ tworzone jest pełne drzewo obiektów opisujące dokument XML. 8.5. Transformacje XSL (XSLT) Na obecnym etapie rozwoju aplikacji WWW nie można w nich pominąć operacji przekształcania danych z formatu XML na inny format, na przykład HTML lub PDF. Do realizacji tego zadania konsorcjum W3C proponuje nam język XSL9 (eXtensible Stylesheet Language). Język ten składa się z trzech komponentów: Język XSL Transformations (XSLT)10 stanowi osobny język programowania opisujący transformacje XML. Język XML Path Language (XPath) wykorzystywany jest w języku XSLT do uzyskiwania dostępu do całości dokumentu XML lub jego części. Język XSL Formatting Objects (XSL-FO) stosowany jest do opisywania formatowania danych. Pod względem zasady działania język XSLT jest spokrewniony z uniksowym narzędziem awk. Warunki (Template Match) albo funkcje (Template Name) sto- sowane są po kolei na danych wejściowych. Dla narzędzia awk dane te składają się z wierszy tekstu, natomiast dla języka XSLT danymi wejściowymi jest struktu- ra drzewiasta. Język XSLT, podobnie jak awk, nie może korzystać z przygoto- wanych przez siebie danych wyjściowych. Programy napisane w języku XSLT właściwie są tylko dokumentami XML, a ze względów historycznych nazywane są arkuszami stylów. Z tego właśnie powodu pisanie w tym języku jest wyjątkowo czasochłonne, ponieważ nawet najprostsze konstrukcje wymagają wpisywania dużej ilości tekstu. Na listingu 8.18 przed- stawiony został kod wymagany do zrealizowania w języku XSLT prostej konstruk- cji if-then-else, natomiast na listingu 8.19 — odpowiadający mu wycinek kodu w języku PHP. Listing 8.18. <xsl:template match="/"> Konstrukcja <xsl:choose> if-then-else <xsl:when test="$foobar = 'foo'"> w języku <xsl:call-template name="foo"/> XSLT 9 http://www.w3.org/Style/XSL/ 10 http://www.w3.org/TR/xslt
  • 23. Rozdział 8. ♦ Obsługa XML w PHP 129 </xsl:when> <xsl:otherwise> <xsl:call-template name="bar"/> </xsl:otherwise> </xsl:choose> </xsl:template> <?php Listing 8.19. if ($foobar == 'foo') foo() else bar(); Konstrukcja ?> if-then-else w języku PHP Podobnie jak język DSSSL (Document Style Semantics and Specification Lan- Język guage)11 dla języka SGML, język XSLT jest funkcyjnym językiem transformacji transformacji dla języka XML. Oznacza to, że zawiera on wszystkie wady języków funkcjonal- nych, takie jak wykorzystywanie rekursji do tworzenia pętli albo obsługa zmien- nych, które są bardziej stałymi niż zmiennymi. Poza tym nie pozwala korzystać z zalet programowania funkcjonalnego, czyli programowania z domknięciami albo obliczeń korzystających z funkcji jako typów danych. Takich możliwości język XSLT nie udostępnia. Kolejną wadą języka XSLT jest ograniczenie jego domeny. Co prawda „wie on wszystko” na temat XML i udostępnia wiele funkcji obsługujących takie doku- menty, ale niestety nie ma wielkich możliwości działania w dziedzinach wykra- czających poza XML. Bez wykorzystywania innych języków programowania, takich jak Java, dołączanych do programów tworzonych w języku XSLT poprzez funkcje wywołań zwrotnych, programy te nie są w stanie wykonać jakiejkolwiek operacji poza światem XML. Bez zewnętrznej pomocy nie jest w nich możliwe dołączenie danych z innych źródeł, na przykład baz danych, albo generowanie da- nych w formatach nietekstowych, na przykład grafik lub plików PDF. 8.5.1. Interfejs programowy XSLT w PHP PHP5 udostępnia podobną do interfejsu programistycznego projektu Mozilla klasę XSLTProcessor (prezentowaną na rysunku 8.4), służącą do wykonywania transfor- macji XSLT. W przeciwieństwie do omawianych wcześniej interfejsów progra- mowej obsługi formatu XML, rozszerzenie obsługi XSLT nie jest dołączane do standardowej konfiguracji PHP5. Musi być ono specjalnie aktywowane w czasie budowania pakietu poprzez dodanie w wierszu poleceń parametru --with-xsl (proszę przejrzeć Dodatek A). Na listingu 8.21 za pomocą metody DOMDocument::load() tworzony jest obiekt klasy DOMDocument, do którego ładowane są zarówno dokument XML (przedsta- wiony na listingu 8.1), jak i arkusz stylów XSL (prezentowany na listingu 8.20). Poprzez metody importStylesheet() i transformToDoc() obiekt arkusza stylów XLS przekazywany jest do obiektu procesora XSLT, a dokument wejściowy trans- formowany do nowego obiektu klasy DOMDocument. 11 http://www.jclark.com/dsssl/
  • 24. 130 Część III ♦ Programowanie w PHP5 Rysunek 8.4. Klasa XSLT- Processor Listing 8.20. <?xml version="1.0" encoding="iso-8859-2"?> Arkusz <xsl:stylesheet version="1.0" stylów XSLT xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> dla katalogu <xsl:output method="html" /> książek <xsl:template match="/"> <html> <body> <ul> <xsl:for-each select="books/book"> <li> <xsl:value-of select="author" /><br /> <xsl:value-of select="title" /><br /> ISBN: <xsl:value-of select="isbn" /><br /> </li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet> Listing 8.21. <?php Przekształca- $dokument = DOMDocument::load('books.xml'); nie katalogu $arkuszStylów = DOMDocument::load('books.xsl'); książek z formatu $procesor = new XSLTProcessor; XML $procesor->importStylesheet($arkuszStylów); na format HTML wykonywane print $procesor->transformToDoc($dokument)->saveXML(); przez język ?> XSLT <?xml version="1.0" standalone"yes"?> <html> <body> <ul> <li> Sebastian Bergmann<br/> Profesjonalne tworzenie oprogramowania w PHP 5<br/> 83-246-0069-8<br/> </li>
  • 25. Rozdział 8. ♦ Obsługa XML w PHP 131 <li> Emilian Balanescu<br/> PHP5 i MySQL. Zastosowania e-commerce<br/> 83-7361-830-9<br/> </li> </ul> </body> </html> Alternatywnym sposobem wykonania tej operacji jest wykorzystanie metod transformToUri() i transformToXML(), które wynik transformacji dokumentu za- pisują w pliku albo zwracają w postaci ciągu znaków. Parametry arkusza stylów XSL można kontrolować za pomocą metod getPara- meter(), setParameter() i removeParameter(). 8.5.2. Wywoływanie funkcji PHP z poziomu języka XSLT Za pomocą funkcji XSL php:function można wywoływać dowolne funkcje PHP z wnętrza arkusza stylów XSL. W celu wywołania takiej funkcji koniecznie na- leży zadeklarować odpowiednią przestrzeń nazw, korzystając przy tym z konstruk- cji xmlns:php="http://php.net/xsl" (tak jak na listingu 8.22). Z kolei za pomocą metody registerPHPFunctions() obiektu procesora XSLT aktywowana jest obsługa wykonywania funkcji PHP wywoływanych z arkuszy stylów XSL (proszę spojrzeć na listing 8.23). <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" Listing 8.22. xmlns:php="http://php.net/xsl" version='1.0'> Zastosowanie <xsl:template match="/"> funkcji PHP <xsl:value-of select="php:function('str_rot13', 'CUC 5')"/> w arkuszu stylów XSL </xsl:template> </xsl:stylesheet> <?php Listing 8.23. $arkuszStylów = DOMDocument::load('php_function.xsl'); Transformacje wykonywane $procesor = new XSLTProcessor; w arkuszu stylów XSL $procesor->registerPHPFunctions(); korzystającym $procesor->importStylesheet($arkuszStylów); z funkcji PHP $wynik = $procesor->transformToDoc(new DOMDocument); print $wynik->saveXML(); ?> PHP 5
  • 26. 132 Część III ♦ Programowanie w PHP5 8.6. Przenoszenie obiektów do sieci WWW za pomocą biblioteki XML_Transformer Biblioteka XML_Transformer12 (sposób jej instalacji przedstawiony został na rysunku 8.5) wzorowana jest na rozwiązaniach dwóch zadań, które na pierwszy rzut oka nie mają ze sobą nic wspólnego. Po pierwsze, wielu programistów szu- ka możliwości przeniesienia obiektów PHP „do sieci WWW”. Po drugie, prze- kształcenia danych XML z jednego formatu na inny są nieodłącznym elementem tworzenia aplikacji WWW. Rysunek 8.5. Instalowanie biblioteki XML_ W przeciwieństwie do transformacji XSL rozwiązujących przedstawione wyżej Transformer cząstkowe problemy, biblioteka XML_Transformer pozwala na proceduralną de- finicję transformacji XSL. W bibliotece tej można wykorzystać najróżniejsze moż- liwości PHP, takie jak dostęp do baz danych albo tworzenie grafiki. Dodatkowo, inaczej niż w języku XSLT, wynik działania jednej z operacji pośrednich może być wykorzystany jako wejście kolejnego kroku procesu. 8.6.1. Użytkowanie biblioteki XML_Transformer Procedury Mówiąc ogólnie, kodowanie za pomocą biblioteki XML_Transformer polega na obsługi wykorzystaniu istniejących procedur obsługi przestrzeni nazw (ang. namespace przestrzeni nazw handler) lub na tworzeniu własnych. Na listingu 8.24 przedstawione zostało za- stosowanie zawartej w pakiecie procedury obsługi przestrzeni nazw Image. Pro- cedura ta stanowi „inteligentną” wersję elementu <img />, która automatycznie dopasowuje wartości atrybutów width i height na podstawie informacji o obrazie uzyskanych za pomocą funkcji getimagesize(). Listing 8.24. <?php Inteligentny require_once 'XML/Transformer.php'; znacznik require_once 'XML/Transformer/Namespace/Image.php'; <img /> z procedurą $t = new XML_Transformer( obsługi array( przestrzeni 'debug' => TRUE, nazw Image 'overloadedNamespaces' => array( 'img' => new XML_Transformer_Namespace_Image ) ) ); 12 http://www.sebastian-bergmann.de/XML_Transformer/
  • 27. Rozdział 8. ♦ Obsługa XML w PHP 133 print $t->transform('<img:img src="image.png" />'); ?> <img height="42" src="image.png" width="23" /> W celu wykonania tych operacji najpierw ładowane są klasy XML_Transformer i XML_Transformer_Namespace_Image. Następnie tworzony jest obiekt klasy XML_ Transformer, a w jego konstruktorze przekazywana jest przestrzeń nazw img, zwią- zana z obiektem klasy XML_Transformer_Namespace_Image. Faktyczna transforma- cja wykonywana jest w metodzie transform, której w jedynym parametrze prze- kazywany jest wejściowy element XML w postaci ciągu znaków. Do ustalania parametrów i definiowania transformacji w klasie XML_Transformer udostępniane są odpowiednie metody. Na listingu 8.25 najpierw tworzony jest zatem obiekt klasy XML_Transformer, dla którego aktywowany jest tryb debugo- wania i ładowane są transformacje procedury obsługi przestrzeni nazw. <?php Listing 8.25. require_once 'XML/Transformer.php'; Ustalanie require_once 'XML/Transformer/Namespace/Image.php'; parametrów za pomocą $t = new XML_Transformer; metod klasy XML_ Transformer $t->setDebug(TRUE); $t->overloadNamespace( 'img', new XML_Transformer_Namespace_Image ); ?> Parametry transformacji można ustalać również w momencie tworzenia obiektu, przekazując je konstruktorowi klasy XML_Transformer, tak jak zrobione to zostało na listingu 8.24. 8.6.2. Stosowanie klasy sterownika XML_Transformer Biblioteka XML_Transformer, oprócz możliwości bezpośredniego korzystania z kla- Klasy sy XML_Transformer i wykonywania transformacji za pomocą jej metody trans- sterowników form, udostępnia klasy sterowników, rozbudowujących standardowe zachowania tej klasy. Na listingu 8.26 przedstawiony został sposób użycia klasy sterownika XML_Transformer_Driver_OutputBuffer, która korzysta z dostępnego w PHP me- chanizmu bufora wyjściowego (ang. output-buffer), aby zachować w buforze całość danych wyjściowych skryptu, w którym jest używana, a następnie zastosować je jako wejściowy dokument XML. <?php Listing 8.26. require_once 'XML/Transformer/Driver/OutputBuffer.php'; Zastosowanie require_once 'XML/Transformer/Namespace/Image.php'; sterownika Output-Buffer
  • 28. 134 Część III ♦ Programowanie w PHP5 $t = new XML_Transformer_Driver_OutputBuffer( array( 'overloadedNamespaces' => array( 'img' => new XML_Transformer_Namespace_Image ) ) ); ?> <img:img src="image.png" /> Inną klasą sterownika jest klasa XML_Transformer_Driver_Cache, która zapisuje w buforze wynik wykonanej transformacji. Dzięki temu można pominąć przyszłe transformacje wykonywane na identycznych danych wejściowych i podać goto- wy wynik pobrany z takiego bufora. 8.6.3. Dostarczane procedury obsługi przestrzeni nazw Poznaliśmy już jedną procedurę obsługi przestrzeni nazw zawartą w klasie XML_ Transformer_Namespace_Image, należącej do biblioteki XML_Transformer. Teraz przedstawione zostaną skrócone opisy pozostałych procedur obsługi przestrzeni nazw dostarczanych wraz z biblioteką. Anchor Procedura obsługi przestrzeni nazw Anchor udostępnia cały szereg znaczników, które normalnie pozwalają na tworzenie pośrednich, nazwanych łączy powiąza- nych z przestrzenią nazw a, czyli tak zwanych URN. Przykład zastosowania tej procedury został przedstawiony na listingu 8.27. Listing 8.27. <?php Przykład require_once 'XML/Transformer/Driver/OutputBuffer.php'; zastosowania require_once 'XML/Transformer/Namespace/Anchor.php'; procedury obsługi $t = new XML_Transformer_Driver_OutputBuffer( przestrzeni array( nazw Anchor 'overloadedNamespaces' => array( 'anchor' => new XML_Transformer_Namespace_Anchor ) ) ); ?> <!-- Tworzy nowy wpis --> <anchor:link name="php" href="http://www.php.net/" title="PHP Homepage" /> <!-- Tworzy znacznik HTML <a /> --> <anchor:iref iref="php">The PHP Homepage</anchor:iref> <a href="http://www.php.net/" title="PHP Homepage">The PHP Homepage</a>
  • 29. Rozdział 8. ♦ Obsługa XML w PHP 135 DocBook Procedura obsługi przestrzeni nazw DocBook udostępnia transformacje pozwala- jące na przekształcenie podzbioru znaczników DocBook XML na format HTML. Można ją traktować jako przykładową kompletną implementację procedury obsługi przestrzeni nazw, w której wykonanie transformacji wymaga wykonania kilku przebiegów. Podobnie jak w procesorze LaTeX, w pierwszym przebiegu zbierane są dane na temat dokumentu, a w kolejnym są one odpowiednio przetwarzane. Image Procedura obsługi przestrzeni nazw Image, obok prezentowanego już „inteligent- nego” znacznika <img /> udostępnia funkcję dynamicznego generowania grafiki. Działanie i sposób użycia tej funkcji wzorowane są na znaczniku <gtext /> po- chodzącym z platformy Roxen. Przykład użycia tego znacznika przedstawiony został na listingu 8.28. <?php Listing 8.28. require_once 'XML/Transformer/Driver/OutputBuffer.php'; Przykład require_once 'XML/Transformer/Namespace/Image.php'; zastosowania znacznika $t = new XML_Transformer_Driver_OutputBuffer( <img:gtext /> array( 'overloadedNamespaces' => array( 'img' => new XML_Transformer_Namespace_Image ) ) ); ?> <html> <body> <img:gtext bgcolor="#ffffff" fgcolor="#000000"> Tekst graficzny </img:gtext> </body> </html> <html> <body> <img alt="Tekst graficzny" src="/cache/gtext/51445ca8cca0490794648630776939e5.png" width="113" height="16" /> </body> </html> W procedurze obsługi przestrzeni nazw Image wykorzystywany jest specjalny bufor, w którym składowane są grafiki wygenerowane przez znaczniki <img:gtext />, dzięki czemu nie trzeba ponownie tworzyć grafiki przy kolejnym żądaniu o takich samych parametrach.
  • 30. 136 Część III ♦ Programowanie w PHP5 PHP Procedura obsługi przestrzeni nazw PHP pozwala między innymi na włączenie kodu PHP bezpośrednio do dokumentu XML, a także na dynamiczne deklarowanie nowych transformacji. Przykład użycia tej procedury przedstawiony został na li- stingu 8.29. Listing 8.29. <?php Przykład require_once 'XML/Transformer_OutputBuffer.php'; zastosowania require_once 'XML/Transformer/Namespace/PHP.php'; procedury obsługi $t = new XML_Transformer_OutputBuffer( przestrzeni array( nazw PHP 'overloadedNamespaces' => array( 'php' => new XML_Transformer_Namespace_PHP ) ) ); ?> <dl> <dd><php:expr>time()</php:expr></dd> <php:setvariable name="foo">bar</php:setvariable> <dd>foo = <php:getvariable name="foo"/></dd> </dl> <dl> <dd>1045740810</dd> <dd>foo = bar</dd> </dl> Widget Procedura obsługi przestrzeni nazw Widget udostępnia między innymi transfor- macje podobne do wykonywanych przez znaczniki <obox /> z platformy Roxen. 8.6.4. Tworzenie własnej procedury obsługi przestrzeni nazw W tym punkcie zajmiemy się sposobami przygotowania własnej procedury obsługi przestrzeni nazw. Jak można się było przekonać w podawanych wcześniej przy- kładach, biblioteka XML_Transformer wiąże funkcje PHP z elementami XML, przy czym dana klasa wiązana jest z określoną przestrzenią nazw. Pseudoprzestrzeń nazw &MAIN pozwala na podobne operacje bez dowiązywania konkretnej przestrze- ni nazw. Klasa PHP wywiedziona z klasy XML_Transformer_Namespace dla każdego elementu powiązanej z nią przestrzeni nazw implementuje dwie metody opisujące transformacje. Metoda start_ELEMENT($attributes) wywoływana jest z atrybu- tami zapisanymi w parametrze $attributes dla każdego otwierającego znacznika elementu, natomiast metoda end_ELEMENT($cdata) wywoływana jest dla znaczni- ków zamykających element, a w jej parametrze przekazywane są dane CDATA tego elementu.
  • 31. Rozdział 8. ♦ Obsługa XML w PHP 137 Obie metody mogą (ale nie muszą) zwracać fragment danych XML w postaci ciągu znaków, który włączany jest do danych wyjściowych w zastępstwie aktu- alnie obsługiwanego elementu XML. Trzeba przy tym uważać, aby zwracany frag- ment nie naruszał prawidłowej budowy dokumentu XML. Na listingu 8.30 przedstawiona została klasa WitajSwiecie, która implementuje taką właśnie procedurę obsługi przestrzeni nazw i za pomocą metod start_ witajSwiecie() i end_witajSwiecie() udostępnia transformację znaczników <witaj- Swiecie />. <?php Listing 8.30. require_once 'XML/Transformer/Driver/OutputBuffer.php'; Procedury require_once 'XML/Transformer/Namespace.php'; obsługi przestrzeni class WitajSwiecie extends XML_Transformer_Namespace { nazw „Witaj function start_witajSwiecie($atrybuty) { świecie” return '<html><body>'; } function end_witajSwiecie($cdata) { return $cdata . 'Witaj świecie!</body></html>'; } } $t = new XML_Transformer_Driver_OutputBuffer( array( 'overloadedNamespaces' => array( '&MAIN' => new WitajSwiecie ) ) ); ?> <witajŚwiecie /> <html> <body> Witaj świecie! </body> </html> Klasa XMLUtil udostępnia metody, które mogą być bardzo użyteczne w czasie tworzenia aplikacji PHP pracujących z danymi w formacie XML. W czasie pro- gramowania procedur obsługi przestrzeni nazw z wykorzystaniem biblioteki XML_ Transformer najbardziej powinny nas zainteresować następujące metody: attributesToString($attributes) — zamienia w ciąg znaków tablicę atrybutów XML, na przykład taką, jaka przekazywana jest w parametrze do metody start_ELEMENT($attributes). Przykład użycia tej metody przedstawiony został na listingu 8.31. <?php Listing 8.31. require_once 'XML/Util.php'; Przykład zastosowania print XML_Util::attributesToString( metody XML_ array( Util::attributes- ToString
  • 32. 138 Część III ♦ Programowanie w PHP5 'width' => 23, 'height' => 42 ) ); ?> height="42" width="23" splitQualifiedName($element) — rozdziela nazwę elementu XML na nazwę przestrzeni nazw i właściwą nazwę elementu oraz zwraca wynik takiej operacji w postaci tablicy. Przykład użycia tej metody przedstawiony został na listingu 8.32. Listing 8.32. <?php Przykład require_once 'XML/Util.php'; zastosowania metody print_r( XML_Util: XML_Util::splitQualifiedName('img') :splitQualified- ); Name print_r( XML_Util::splitQualifiedName('img:img') ); ?> Array ( [0] => &MAIN [1] => img ) Array ( [0] => img [1] => img ) W czasie tworzenia procedury obsługi przestrzeni nazw należy zawsze pamiętać, że biblioteka XML_Transformer wewnętrznie pracuje z parserem SAX. Z tego po- wodu nie jest możliwe utworzenie w jednym przebiegu spisu zawartości doku- mentu XML ani transformacje zmieniające kolejność elementów. Jeżeli wykonanie takich operacji jest mimo wszystko wymagane, to wejściowe dane XML muszą być transformowane w dwóch przebiegach. Wartość TRUE wpisana do atrybutu $secondPassRequired oznacza, że w czasie transformacji konieczne jest wyko- nanie dwóch przebiegów. Tryb W czasie tworzenia własnych procedur obsługi przestrzeni nazw biblioteka XML_ debugowania Transformer może wspomagać nas swoim specjalnym trybem debugowania. Tryb ten może być aktywowany poprzez przekazanie odpowiedniego parametru do kon- struktora klasy XML_Transformer albo bezpośrednie wywołanie metody setDebug (TRUE), tak jak zostało to zrobione na listingach 8.24 i 8.25.
  • 33. Rozdział 8. ♦ Obsługa XML w PHP 139 Dla każdego otwierającego znacznika elementu XML w dzienniku zapisywane są: aktualny poziom stosu elementów, nazwa elementu oraz jego atrybuty. Dla każdego zamykającego znacznika elementu XML zapisywane są: aktualny poziom stosu elementów, nazwa elementu oraz zawartość jego obszaru CDATA. Na rysunku 8.6 przedstawione zostały informacje debugowania zapisane dla ko- du z listingu 8.24. Rysunek 8.6. Komunikaty debugowania z przykładu Przy ustawieniach domyślnych komunikaty debugowania przesyłane są do dzien- dla znacznika <img> nika błędów serwera WWW. Wypisywanie ich na ekranie jest oczywiście moż- liwe, z wyjątkiem przypadku zastosowania klasy sterownika XML_Transformer_ Driver_OutputBuffer. Błędy występujące w czasie obsługiwania danych XML są zapisywane do dzien- nika niezależnie od tego, czy tryb debugowania został włączony. Dzięki dostęp- ności zrzutu stosu (ang. stackdump) można określić miejsce w dokumencie XML, w którym nastąpiło naruszenie jego prawidłowej budowy. Takie naruszenie może nastąpić w samym dokumencie XML albo wynikać z jego transformacji. Przykład takiego komunikatu przedstawiony został na rysunku 8.7. Rysunek 8.7. Komunikat o błędzie klasy XML_ Transformer zawierający zrzut stosu