46

Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim
Page 2: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

Tytuł oryginału: PHP Master: Write Cutting-edge Code

Tłumaczenie: Łukasz Piwko

ISBN: 978-83-246-4472-8

© Helion 2012.

Authorized Polish translation of the English edition of PHP Master, 1st Edition ISBN 9780987090874 © 2011, SitePoint Pty. Ltd.

This translation is published and sold by permission of O’Reilly Media, Inc., theźowner of all rights to publish and sell the same.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher.

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.

Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/misphpMożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Printed in Poland.

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

Page 3: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

Spis tre�ci

Wst�p ........................................................................................................................13Adresaci ksi��ki ..........................................................................................................13Zawarto�� ksi��ki .......................................................................................................14Strona internetowa ksi��ki .........................................................................................16Podzi�kowania ...........................................................................................................16Konwencje typograficzne ............................................................................................17Wskazówki, uwagi i ostrze�enia .................................................................................18

Rozdzia� 1. Programowanie obiektowe .................................................... 19Dlaczego programowanie obiektowe .........................................................................19

Terminologia obiektowa .......................................................................................19Wprowadzenie do programowania obiektowego .......................................................20

Deklarowanie klas ................................................................................................20Konstruktory .........................................................................................................21Tworzenie obiektów .............................................................................................21Automatyczne �adowanie .....................................................................................22U�ywanie obiektów ..............................................................................................23W�asno�ci i metody statyczne ...............................................................................23Obiekty i przestrzenie nazw ..................................................................................24

Dziedziczenie ..............................................................................................................27Obiekty i funkcje .........................................................................................................29

Okre�lanie typów parametrów ..............................................................................29Polimorfizm ..........................................................................................................29Obiekty i referencje ...............................................................................................30Przekazywanie obiektów jako parametrów funkcji ................................................31P�ynne interfejsy ...................................................................................................32

S�owa kluczowe public, private i protected .................................................................33Modyfikator public ...............................................................................................33Modyfikator private ..............................................................................................33Modyfikator protected ..........................................................................................34Wybór zakresu dost�pno�ci ..................................................................................34Kontrola dost�pno�ci przy u�yciu metod sprawdzaj�cych i ustawiaj�cych .............35Magiczne metody __get i __set ............................................................................36

Interfejsy ....................................................................................................................37Interfejs Countable z biblioteki SPL .......................................................................37Liczenie obiektów .................................................................................................37Deklarowanie i u�ywanie interfejsów ...................................................................38Identyfikowanie obiektów i interfejsów ................................................................39

Page 4: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

6 Mistrz PHP. Pisz nowoczesny kod

Wyj�tki .......................................................................................................................40Obs�uga wyj�tków ................................................................................................40Dlaczego nale�y u�ywa� wyj�tków .......................................................................41Zg�aszanie wyj�tków ............................................................................................41Rozszerzanie klas wyj�tków ..................................................................................41Przechwytywanie wybranych typów wyj�tków .....................................................42Ustawianie globalnej procedury obs�ugi wyj�tków ...............................................43Wywo�ania zwrotne .............................................................................................44

Metody magiczne — zaawansowane wiadomo�ci .....................................................44Metody __call() i __callStatic() ..............................................................................45Drukowanie zawarto�ci obiektów przy u�yciu metody __toString() .......................46Serializacja obiektów ............................................................................................46

Osi�gni�te cele ...........................................................................................................48

Rozdzia� 2. Bazy danych ................................................................................ 49Dane trwa�e i aplikacje sieciowe .................................................................................49Sposoby sk�adowania danych .....................................................................................50Budowanie serwisu z przepisami na podstawie bazy MySQL ......................................51

Tworzenie tabel ....................................................................................................51Rozszerzenie PDO .......................................................................................................53

��czenie si� z baz� MySQL przy u�yciu PDO ..........................................................53Pobieranie danych z tabel w bazie ........................................................................54Tryby pobierania danych ......................................................................................54Parametry i instrukcje preparowane ......................................................................55Wi�zanie warto�ci i zmiennych z instrukcjami preparowanymi ..............................57Wstawianie wiersza i pobieranie jego identyfikatora ............................................58Sprawdzanie liczby wstawionych, zmienionych i usuni�tych rekordów .................59Usuwanie danych .................................................................................................60

Obs�uga b��dów w PDO .............................................................................................60Obs�uga b��dów zwi�zanych z przygotowywaniem zapyta .................................60Obs�uga b��dów zwi�zanych z wykonywaniem zapyta .......................................61Obs�uga b��dów zwi�zanych z pobieraniem danych .............................................62

Zaawansowane funkcje PDO ......................................................................................63Transakcje a PDO ..................................................................................................63Procedury sk�adowane i PDO ................................................................................64

Projektowanie bazy danych ........................................................................................65Klucze g�ówne i indeksy ........................................................................................65Polecenie MySQL Explain ......................................................................................65Z��czenia wewn�trzne ..........................................................................................69Z��czenia zewn�trzne ............................................................................................70Funkcje agreguj�ce i grupowanie .........................................................................71Normalizacja danych ............................................................................................72

Podsumowanie ..........................................................................................................74

Page 5: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

SPIS TRECI 7

Rozdzia� 3. Interfejsy programistyczne ...................................................... 75Zanim zaczniesz .........................................................................................................75

Narz�dzia do pracy z API ......................................................................................75Dodawanie API do systemu ..................................................................................76

Architektura us�ugowa ...............................................................................................76Formaty danych ..........................................................................................................77

Format JSON .........................................................................................................77Format XML ..........................................................................................................79

HTTP — protokó� przesy�ania hipertekstu ...................................................................82Dane przesy�ane w nag�ówkach HTTP ...................................................................82Wysy�anie ��da HTTP ..........................................................................................83Kody statusu HTTP ................................................................................................87Nag�ówki HTTP .....................................................................................................87Czasowniki HTTP ..................................................................................................91

Kryteria wyboru typów us�ug ......................................................................................92PHP i SOAP ...........................................................................................................92Opis us�ug SOAP za pomoc� j�zyka WSDL ............................................................94

Diagnozowanie HTTP .................................................................................................95Gromadzenie informacji w dzienniku ....................................................................95Kontrola ruchu HTTP .............................................................................................96

Us�ugi RPC .................................................................................................................96Korzystanie z us�ug RPC: przyk�ad na podstawie serwisu Flickr .............................97Tworzenie us�ugi RPC ...........................................................................................98

Us�ugi sieciowe a Ajax ..............................................................................................100��dania mi�dzydomenowe .................................................................................104

Us�ugi RESTful ..........................................................................................................106Wi�cej ni� pi�kne adresy URL .............................................................................107Zasady us�ug RESTful ..........................................................................................107Budowanie us�ugi RESTful ..................................................................................108

Projektowanie us�ugi sieciowej .................................................................................114Do us�ug ..................................................................................................................115

Rozdzia� 4. Wzorce projektowe ................................................................. 117Czym s� wzorce projektowe .....................................................................................117

Wybieranie wzorca .............................................................................................117Wzorzec singleton ..............................................................................................118Cechy .................................................................................................................119Wzorzec rejestr ...................................................................................................120Wzorzec fabryka .................................................................................................124Wzorzec iterator .................................................................................................125Wzorzec obserwator ...........................................................................................133

Page 6: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

8 Mistrz PHP. Pisz nowoczesny kod

Wzorzec wstrzykiwanie zale�no�ci ......................................................................136Wzorzec model-widok-kontroler .........................................................................139

Tworzenie wzorców .................................................................................................150

Rozdzia� 5. Bezpiecze�stwo ....................................................................... 151Dzia�aj jak paranoik ..................................................................................................151Filtruj dane wej�ciowe, koduj dane wyj�ciowe .........................................................152

Filtrowanie i weryfikacja .....................................................................................152Cross-site scripting ...................................................................................................153

Atak ...................................................................................................................154Obrona ...............................................................................................................155Materia�y w internecie ........................................................................................155

Cross-site Request Forgery .......................................................................................156Atak ...................................................................................................................156Obrona ...............................................................................................................157Materia�y w internecie ........................................................................................159

Session fixation ........................................................................................................159Atak ...................................................................................................................159Obrona ...............................................................................................................160Materia�y w internecie ........................................................................................160

Session hijacking ......................................................................................................161Atak ...................................................................................................................161Obrona ...............................................................................................................162Materia�y w internecie ........................................................................................163

SQL injection ............................................................................................................163Atak ...................................................................................................................163Obrona ...............................................................................................................164Materia�y w internecie ........................................................................................165

Przechowywanie hase� .............................................................................................165Atak ...................................................................................................................165Obrona ...............................................................................................................166Materia�y w internecie ........................................................................................167

Atak si�owy ..............................................................................................................167Atak ...................................................................................................................167Obrona ...............................................................................................................169Materia�y w internecie ........................................................................................169

SSL ...........................................................................................................................170Atak ...................................................................................................................170Obrona ...............................................................................................................171Materia�y w internecie ........................................................................................171

Dodatkowe zasoby ...................................................................................................172

Page 7: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

SPIS TRECI 9

Rozdzia� 6. Wydajno�� ................................................................................. 173Benchmarking ..........................................................................................................173Dostrajanie systemu .................................................................................................179

Zapisywanie kodu w pami�ci podr�cznej ............................................................179Ustawienia inicjacyjne ........................................................................................184

Bazy danych .............................................................................................................184System plików ..........................................................................................................185

Buforowanie .......................................................................................................185Profilowanie .............................................................................................................192

Instalowanie narz�dzia XHProf ...........................................................................193Instalowanie XHGui ............................................................................................197

Podsumowanie ........................................................................................................204

Rozdzia� 7. Automatyzacja testów ........................................................... 205Testy jednostkowe ...................................................................................................205

Instalowanie narz�dzia PHPUnit .........................................................................206Pisanie przypadków testowych ...........................................................................206Wykonywanie testów .........................................................................................208Dublery ..............................................................................................................210Pisanie kodu przystosowanego do testowania ....................................................213Pisanie testów dla widoków i kontrolerów .........................................................217

Testowanie baz danych ............................................................................................221Przypadki testowe baz danych ............................................................................221Po��czenia ..........................................................................................................222Zbiory danych .....................................................................................................223Asercje ...............................................................................................................225

Testowanie systemowe ............................................................................................226Wst�pna konfiguracja .........................................................................................226Polecenia ............................................................................................................227Lokalizatory ........................................................................................................228Asercje ...............................................................................................................229Integracja z baz� danych ....................................................................................230Diagnozowanie usterek ......................................................................................231Automatyzacja pisania testów ............................................................................232

Testowanie obci��eniowe ........................................................................................233ab .......................................................................................................................233Siege ..................................................................................................................234

Wypróbowane i przetestowane ................................................................................236

Page 8: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

10 Mistrz PHP. Pisz nowoczesny kod

Rozdzia� 8. Kontrola jako�ci ....................................................................... 237Pomiar jako�ci za pomoc� narz�dzi analizy statycznej ...............................................237

Narz�dzie phploc ................................................................................................238Narz�dzie phpcpd ...............................................................................................239Narz�dzie phpmd ...............................................................................................240

Standardy kodowania ...............................................................................................241Weryfikacja kodu pod k�tem standardów kodowania przy u�yciu narz�dzia

PHP_CodeSniffer ..............................................................................................241Przegl�danie przypadków naruszenia regu� standardów kodowania ...................243Standardy kodowania w narz�dziu PHP_CodeSniffer ..........................................244

Dokumentacja i kod ..................................................................................................244Narz�dzie phpDocumentor .................................................................................246Inne narz�dzia dokumentacyjne ..........................................................................248

Kontrola �ród�a .........................................................................................................248Praca z centralnym systemem kontroli wersji ......................................................249Kontrola �ród�a przy u�yciu systemu Subversion .................................................250Projektowanie struktury repozytorium ................................................................252Rozproszone systemy kontroli wersji ...................................................................254Spo�eczno�ciowe narz�dzia dla programistów ....................................................255Kontrola kodu �ród�owego przy u�yciu narz�dzia Git ..........................................255Repozytorium jako centrum procesu budowy ......................................................257

Automatyzacja procesu wdra�ania ...........................................................................257Natychmiastowe prze��czanie na now� wersj� ...................................................257Zarz�dzanie zmianami w bazie danych ...............................................................258Automatyzacja wdra�ania i plik konfiguracyjny Phing .........................................259

Gotowi do wdra�ania ...............................................................................................261

Dodatek A Biblioteki PEAR i PECL ............................................................ 263Biblioteka PEAR ........................................................................................................263Biblioteka PECL ........................................................................................................263Instalowanie pakietów .............................................................................................264

Kana�y PEAR .......................................................................................................266U�ywanie kodu PEAR ..........................................................................................268

Instalowanie rozszerze ...........................................................................................268R�czne kompilowanie rozszerze ........................................................................269

Tworzenie pakietów .................................................................................................272Kontrola wersji pakietów ..........................................................................................276Tworzenie kana�u .....................................................................................................277Co dalej ....................................................................................................................280

Page 9: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

SPIS TRECI 11

Dodatek B SPL: Standard PHP Library ..................................................... 281Interfejsy ArrayAccess i ArrayObject ..........................................................................281Automatyczne wczytywanie .....................................................................................282Praca na katalogach i plikach ...................................................................................283Interfejs Countable ...................................................................................................285Struktury danych ......................................................................................................286

Tablice o sta�ym rozmiarze ..................................................................................286Listy ....................................................................................................................286Stosy i kolejki .....................................................................................................287Sterty ..................................................................................................................287Kolejki priorytetowe ...........................................................................................288Funkcje ...............................................................................................................288

Dodatek C Dalszy rozwój ........................................................................... 289Czytaj, czytaj, czytaj ..................................................................................................289Uczestnictwo w wydarzeniach ..................................................................................290Grupy u�ytkowników ................................................................................................291Spo�eczno�ci internetowe .........................................................................................291Projekty typu open source ........................................................................................292

Skorowidz .................................................................................. 293

Page 10: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

12 Mistrz PHP. Pisz nowoczesny kod

Page 11: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

Rozdzia�

Kontrola jako�ciTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów.Poznasz w nim narzędzia pozwalające zapewnić wysoką jakość pisanych przez siebie programów.Wśród nich znajdują się programy do kontroli wersji kodu źródłowego, wspomagające współpracęmiędzy członkami zespołu programistycznego i ułatwiające panowanie nad rozwojem programu,oraz narzędzia do automatycznego wdrażania systemów do środowiska produkcyjnego, które w od-różnieniu od człowieka o niczym nie zapominają. Ponadto poznasz techniki analizy kodu w celusprawdzenia, czy jest spójny i dobrze sformatowany, oraz dowiesz się, jak się generuje dokumen-tację z kodu źródłowego.

Wymienione narzędzia to elementy każdego dobrze prowadzonego projektu, w którym ograni-czono do minimum ilość czasu potrzebnego na zajmowanie się mniej ważnymi aspektami tech-nicznymi, a więcej pozostawiono na budowę wspaniałego programu.

Pomiar jako�ci za pomoc� narz�dzi analizy statycznejAnaliza statyczna polega na badaniu kodu bez jego uruchamiania. Narzędzia służące do jej wy-konywania oceniają kod w takiej postaci, w jakiej jest zapisany w plikach. Istnieje wiele progra-mów, których można używać do tego celu, a co ciekawe, za najlepsze z nich nie trzeba płacić.Dzięki tym narzędziom można uzyskać ogólny obraz podstawy kodu (lub jej części), nawet gdyjest ona bardzo skomplikowana i obszerna.

Narzędzia do analizy statycznej stanowią jeden z kluczowych składników projektu programi-stycznego, ale są naprawdę przydatne tylko wtedy, kiedy włącza się je regularnie, najlepiej za każdymrazem po zatwierdzeniu kodu w systemie zarządzania kodem źródłowym. Zwracają wiele cen-nych informacji na temat kodu (od liczby klas i wierszy, po wskazanie podobnych fragmentów),co może oznaczać, że zostały skopiowane z jednego miejsca i wklejone do innego! Pokażemy, w jakisposób narzędzia do analizy statycznej pomagają zapanować nad dwoma niezmiernie ważnymiaspektami: standardami kodowania i dokumentacją.

Page 12: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

238 Mistrz PHP. Pisz nowoczesny kod

Wszystkie narzędzia, które opisano w tej części rozdziału, można pobrać z biblioteki PEAR — opis,jak instaluje się programy przy użyciu tego narzędzia do zarządzania pakietami, znajduje się w do-datku A. Niektóre z tych programów mogą też być dostępne poprzez menedżer pakietów systemuoperacyjnego, jeśli używasz jednego z systemów uniksowych. Możesz skorzystać z tej możliwości,ale pamiętaj, że istnieje duże ryzyko, iż wersje tak dostępnych aplikacji będą nieaktualne.

Narz�dzie phplocNazwa PHP Lines of Code (wiersze kodu PHP) może nie brzmi zbyt zachęcająco, ale narzędzie todostarcza naprawdę cennych informacji, zwłaszcza gdy jest uruchamiane wielokrotnie przez pe-wien czas. Dzięki niemu można poznać topologię i rozmiar projektu. Oto wynik zwrócony przeznarzędzie phploc dla standardowej wersji systemu WordPress:

$ phploc wordpress/phploc 1.6.1 by Sebastian Bergmann.

Directories: 26Files: 380

Lines of Code (LOC): 171170 Cyclomatic Complexity / Lines of Code: 0.19Comment Lines of Code (CLOC): 53521Non-Comment Lines of Code (NCLOC): 117649

Namespaces: 0Interfaces: 0Classes: 190 Abstract: 0 (0.00%) Concrete: 190 (100.00%) Average Class Length (NCLOC): 262Methods: 1990 Scope: Non-Static: 1986 (99.80%) Static: 4 (0.20%) Visibility: Public: 1966 (98.79%) Non-Public: 24 (1.21%) Average Method Length (NCLOC): 25 Cyclomatic Complexity / Number of Methods: 5.56

Anonymous Functions: 0Functions: 2330

Constants: 351 Global constants: 348 Class constants: 3

System ten zawiera bardzo dużą liczbę wierszy kodu, a ponieważ jego początki sięgają dość dalekow przeszłość, elementów języka PHP 5 jest w nim niewiele. Dzięki phploc można sprawdzić roz-miar nieznanego programu albo analizować przyrost i zmiany kodu we własnym projekcie. Abyużyć phploc, należy zastosować następujące polecenie:

phploc wordpress/

Page 13: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 239

Jego wynik będzie podobny do pokazanego powyżej. Dane te można zapisać w różnych formatach,np. XML do użytku w systemie ciągłej integracji.

Z�o�ono�� cyklomatyczna

Z�o�ono�� cyklomatyczna to, najpro�ciej mówi�c, miara okre�laj�ca liczb� �cie�ek wykonania funkcji (tzn.pokazuj�ca, jak bardzo ta funkcja jest skomplikowana), zwi�zana z tym, ile testów mo�e by� potrzebnychdo ca�kowitego przetestowania funkcji. Ogólnie rzecz bior�c: bardzo wysoka warto�� oznacza, �e lepiej prze-pisa� funkcj� od nowa i wydzieli� z niej mniejsze metody, które b�dzie �atwiej przetestowa�.

Narz�dzie phpcpdPHP Copy Paste Detector (wykrywacz kopiowania i wklejania kodu PHP) to narzędzie wyszuku-jące w kodzie źródłowym takie same fragmenty w celu wykrycia części, które zostały skopiowanez jednego miejsca i wklejone do innego. Warto regularnie korzystać z tego dodatku, mimo że nieda się określić, jaki wynik jest najlepszy, jest to bowiem miara zależna od konkretnego projektu.W ramach przykładu ponownie użyjemy systemu WordPress, ponieważ jest to dobrze wszystkimznany projekt typu open source:

$ phpcpd wordpress/phpcpd 1.3.2 by Sebastian Bergmann.

Found 33 exact clones with 562 duplicated lines in 14 files:

- wp-admin/includes/update-core.php:482-500 wp-admin/includes/file.php:733-751

- wp-admin/includes/class-wp-filesystem-ssh2.php:346-365 wp-admin/includes/class-wp-filesystem-direct.php:326-345

...

- wp-includes/class-simplepie.php:10874-10886 wp-includes/class-simplepie.php:13185-13197

- wp-content/plugins/akismet/admin.php:488-500 wp-content/plugins/akismet/admin.php:537-549

- wp-content/plugins/akismet/legacy.php:234-248 wp-content/plugins/akismet/legacy.php:301-315

0.33% duplicated lines out of 171170 total lines of code.

Time: 6 seconds, Memory: 154.50Mb

Dane takie szczególnie warto analizować przez pewien czas. To narzędzie może również zapisy-wać wyniki w formacie XML zrozumiałym dla systemu ciągłej integracji, dzięki czemu można jebezproblemowo dodać do skryptów wdrożeniowych i zwrócone informacje przedstawić w postaciwykresu. Mając wykaz nowych fragmentów kodu, które są do siebie podobne, można wykryćwszystkie duplikaty kodu i zastanowić się nad możliwościami wielokrotnego wykorzystania kodu.Należy jednak pamiętać, że nie zawsze ponowne użycie kodu jest korzystne. Zawsze warto rozwa-żyć taką możliwość, jednak nie należy z tym przesadzać.

Page 14: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

240 Mistrz PHP. Pisz nowoczesny kod

Narz�dzie phpmdPHP Project Mess Detector (wykrywacz bałaganu w PHP) to narzędzie pozwalające znaleźć w kodzietzw. „śmierdzące fragmenty” (ang. code smells). Przeszukuje ono kod, stosując szereg metryk, abyznaleźć fragmenty, które wydają się nie w porządku. Program ten zwraca bardzo dużo danych, alewiększość z nich to tylko dobre rady. Poniżej znajduje się fragment wyniku wyszukiwania pro-blemów związanych z nazwami w systemie WordPress:

$ phpmd wordpress/ text naming/home/lorna/downloads/wordpress/wp-includes/widgets.php:32 �/home/lorna/downloads/wordpress/wp-includes/widgets.php:76 �/home/lorna/downloads/wordpress/wp-includes/widgets.php:189 �/home/lorna/downloads/wordpress/wp-includes/widgets.php:319 �/home/lorna/downloads/wordpress/wp-includes/widgets.php:333I �/home/lorna/downloads/wordpress/wp-includes/widgets.php:478 �/home/lorna/downloads/wordpress/wp-includes/widgets.php:496

� Avoid variables with short names like $id. (Staraj się nie stosować krótkich nazw zmiennych,takich jak $id).

� Classes shouldn’t have a constructor method with the same name as the class. (Konstruktorklasy nie powinien nazywać się tak samo jak zawierająca go klasa).

� Avoid excessively long variable names like $wp_registered_widgets. (Staraj się nie nadawaćzmiennym zbyt długich nazw, takich jak $wp_registered_widgets).

� Classes shouldn’t have a constructor method with the same name as the class. (Konstruktorklasy nie powinien nazywać się tak samo jak zawierająca go klasa).

� Avoid excessively long variable names like $wp_registered_widgets. (Staraj się nie nadawaćzmiennym zbyt długich nazw, takich jak $wp_registered_widgets).

� Avoid excessively long variable names like $wp_registered_sidebars. (Staraj się nie nadawaćzmiennym zbyt długich nazw, takich jak $wp_registered_sidebars).

Avoid extremely short variable names like $n. (Staraj się nie używać bardzo krótkich nazwzmiennych, takich jak $n).

Narzędzie takie pewnie w każdym projekcie wyświetli jakieś błędy, ale warto z niego korzystać,aby móc zaobserwować ogólne tendencje. W punkcie 2. znajduje się komentarz, że nazwa kon-struktora nie może być taka sama jak nazwa zawierającej go klasy, ale WordPress do niedawnabył zgodny z PHP 4, więc nie jest to w nim błędem. Dostępne są jeszcze inne reguły, takie jak:metryki dotyczące rozmiaru kodu, elementy projektowe (np. wyszukiwanie użyć funkcji eval())i znajdowanie nieużywanego kodu.

Wszystkie te narzędzia pozwalają lepiej zrozumieć zakres i kształt bazy kodu oraz ukazują obszary,które mogą wymagać poprawienia. W następnym podrozdziale pokażemy, jak sprawdzić, czy kodjest napisany zgodnie ze standardami kodowania.

Page 15: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 241

Standardy kodowaniaStandardy kodowania to w niektórych zespołach programistycznych temat gorących dyskusji.Skoro rozmieszczenie wcięć i spacji nie ma żadnego znaczenia dla sposobu wykonywania kodu,to po co w ogóle definiować jakieś zasady, a potem się ich trzymać? Chodzi o to, że przyzwycza-jamy się do określonego sposobu formatowania kodu i jeśli napotkamy kod napisany w taki sposób,łatwiej jest nam go zrozumieć.

Czasami jednak rozmieszczenie wszystkiego zgodnie ze standardem bywa bardzo trudne. Możeszprzeczytać wszystkie wytyczne dotyczące projektu, do którego właśnie przystąpiłeś, ale i tak, gdytylko zaczynasz pisać, zapominasz, gdzie powinien znajdować się każdy rodzaj nawiasu. Problemten rozwiązuje się na dwa sposoby. Po pierwsze, poprzez odpowiednią konfigurację edytora, abypoprawnie stosował zakończenia wierszy oraz właściwie wstawiał tabulatory i spacje. Po drugie,możesz użyć specjalnego narzędzia do sprawdzania kodu, o nazwie PHP_CodeSniffer.

Weryfikacja kodu pod k�tem standardów kodowaniaprzy u�yciu narz�dzia PHP_CodeSnifferNajpierw trzeba zainstalować narzędzie na serwerze. To, czy zrobisz to na maszynie roboczej, czyna serwerze produkcyjnym, zależy od tego, jaką ilością zasobów dysponujesz. PHP_CodeSnifferjest dostępny w PEAR1 (szczegółowe informacje na temat korzystania z PEAR znajdują się w do-datku A). W wielu dystrybucjach Linuksa program ten jest również dostępny w postaci pakietu.

U�ycie narz�dzia PHP_CodeSniffer do analizy kodu JavaScript i CSS

Je�li w projekcie znajduj� si� pliki JavaScript albo CSS, to je równie� mo�na sprawdzi� pod k�tem zgodno�ciz odpowiednimi standardami kodowania.

Po zainstalowaniu narzędzia można zacząć pracę. Sposób analizy kodu za jego pomocą przedsta-wimy na przykładzie bardzo prostej poniższej klasy:

class Robot { protected $x = 0; protected $y = 0;

public function getCatchPhrase() { return 'Oto ja, intelekt przewy�szaj�cy...'; }

public function Dance() { $xmove = rand(-2, 2); $ymove = rand(-2, 2); if($xmove != 0) { $this->x += $xmove; } if($ymove != 0) {

1 http://pear.php.net/package/PHP_CodeSniffer/.

Page 16: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

242 Mistrz PHP. Pisz nowoczesny kod

$this->y += $ymove; } return true; }

}

Kod ten wygląda całkiem normalnie, prawda? Zobaczmy, co na jego temat powie nam PHP_CodeSniffer. W tym przykładzie użyjemy standardu PEAR:

phpcs --standard=PEAR robot.php

FILE: /home/lorna/data/personal/books/Sitepoint/PHPPro/qa/code/robot.php--------------------------------------------------------------FOUND 10 ERROR(S) AND 0 WARNING(S) AFFECTING 6 LINE(S)-------------------------------------------------------------- 2 | ERROR | Missing file doc comment 4 | ERROR | Opening brace of a class must be on the line after the definition 4 | ERROR | You must use "/**" style comments for a class comment 8 | ERROR | Missing function doc comment 8 | ERROR | Opening brace should be on a new line 12 | ERROR | Public method name "Robot::Dance" is not in camel caps format 12 | ERROR | Missing function doc comment 12 | ERROR | Opening brace should be on a new line 15 | ERROR | Expected "if (...) {\n"; found "if(...) {\n" 18 | ERROR | Expected "if (...) {\n"; found "if(...) {\n"---------------------------------------------------------------

Popełniliśmy 10 błędów — biorąc pod uwagę, że kod składa się tylko z 10 wierszy, nie jest to do-brym wynikiem. Jeśli jednak przyjrzysz się dokładniej tym danym, zauważysz, że niektóre błędysię powtarzają. Komunikaty o błędach dotyczą braku komentarzy (Missing file doc comment),niewłaściwego umiejscowienia nawiasów (Opening brace should be on a new line i Opening braceof a class must be on the line after the definition) oraz braku spacji za instrukcjami if(Expected "if (...) {\n"; found "if(...) {\n"). Oto poprawiona wersja tej klasy:

/** * Robot * * PHP Version 5 * * @category Example * @package Example * @author Lorna Mitchell <[email protected]> * @copyright 2011 Sitepoint.com * @license PHP Version 3.0 {@link http://www.php.net/license/3_0.txt} * @link http://sitepoint.com */class Robot{ protected $x = 0; protected $y = 0;

public function getCatchPhrase() { return 'Oto ja, intelekt przewy�szaj�cy...'; }

Page 17: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 243

public function dance() { $xmove = rand(-2, 2); $ymove = rand(-2, 2); if ($xmove != 0) { $this->x += $xmove; } if ($ymove != 0) { $this->y += $ymove; } return true; }}

Po ponownym sprawdzeniu tego kodu zauważymy, że większość błędów zniknęła. Do rozwiąza-nia pozostała jeszcze tylko kwestia bloków komentarzy dla pliku i dla dwóch funkcji. Ponieważw dalszej części rozdziału będziemy zajmować się pisaniem dokumentacji w kodzie, na razie zo-stawimy to bez poprawek.

Przegl�danie przypadkównaruszenia regu� standardów kodowaniaPHP_CodeSniffer oferuje kilka ciekawych opcji widoku, które pozwalają wygodnie oglądać ra-porty i uzyskiwać ogólny obraz bazy kodu. Można je wyświetlić w taki sam sposób jak wcześniejszyszczegółowy raport albo wyeksportować do innego formatu. Aby wygenerować raport podsumo-wujący, należy zastosować następujące polecenie:

phpcs --standard=PEAR --report=summary *------------------------------------------------------------------PHP CODE SNIFFER REPORT SUMMARY------------------------------------------------------------------FILE ERRORS WARNINGS------------------------------------------------------------------...e/eventscontroller.php 93 10...e/rest/index.php 29 3...e/rest/request.php 4 0------------------------------------------------------------------A TOTAL OF 126 ERROR(S) AND 13 WARNING(S) WERE FOUND IN 3 FILE(S)

Te wygenerowane dla usługi RESTful z rozdziału 3. dane pozwalają zorientować się, jak działaopisywana funkcja. W raporcie tym podane są: liczba błędów i ostrzeżeń znalezionych w poszcze-gólnych plikach oraz suma wszystkich znalezionych błędów i ostrzeżeń. Raport można zapisaćw kilku formatach, m.in. w CSV.

Jednym z popularnych formatów jest ten używany przez narzędzie do formatowania kodu Javy,o nazwie Checkstyle2. PHP_CodeSniffer może generować dane w takim samym formacie jakCheckstyle (czyli XML), dzięki czemu można je wyświetlić przy użyciu dowolnego narzędziaobsługującego ten format. Zazwyczaj funkcji tej używa się w połączeniu ze środowiskiem ciągłej

2 http://checkstyle.sourceforge.net/.

Page 18: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

244 Mistrz PHP. Pisz nowoczesny kod

integracji, które generuje te dane regularnie i prezentuje je w formacie internetowym. Ponadtowyświetlany jest wykres przedstawiający liczby błędów i ostrzeżeń wraz z informacją o tym, któreusterki poprawiono, a które są nowe.

Standardy kodowania w narz�dziu PHP_CodeSnifferNarzędzie PHP_CodeSniffer ma standardowo wbudowaną obsługę kilku standardów kodowaniai pozwala na utworzenie i doinstalowanie nowych. Aby sprawdzić, jakie standardy są dostępne,należy wykonać polecenie phpcs z opcją -i:

phpcs -iThe installed coding standards are MySource, PEAR, Squiz, PHPCS and Zend

Jednym z najpowszechniejszych jest standard PEAR, z którego korzysta większość zespołów pro-gramistycznych. Standardy Zend nie są aktualnie standardem Zend Framework (w Zend Frameworkużywa się specjalnie dostosowanej wersji standardu PEAR). Squiz3 to całkiem dobry standard, alema bardzo restrykcyjne zasady dotyczące stosowania pustych wierszy, przez co trudno go używaćna co dzień.

Kluczem do efektywnego posługiwania się standardami kodowania jest wybranie jednego z nichi korzystanie z niego, a nie gadanie o nim, ponieważ najważniejsze jest to, aby w ogóle trzymać sięjakiegoś standardu! Spór dotyczący tego, czy otwierająca klamra powinna znajdować się w tymsamym wierszu co instrukcja, czy w następnym, jest tak jałowy jak dyskusja o tym, czy lepszy jestedytor Vim, czy Emacs. Tych kwestii nie da się ostatecznie rozstrzygnąć.

Może się jednak zdarzyć, że podczas pracy nad programem wyniknie konieczność dostosowaniaalbo rozluźnienia używanego standardu. Na przykład w projektach typu open source można zre-zygnować z oznaczania autora w komentarzach, ponieważ takiej informacji precyzyjnie podać sięnie da. Utworzenie własnego standardu nie jest trudne, zwłaszcza gdy wykorzysta się już istniejącezasady do własnych celów. Standardy programu PHP_CodeSniffer zawierają szereg tzw. niuchaczy(ang. sniff), z których każdy wykonuje jedno ściśle określone zadanie, np. sprawdza, czy międzyinstrukcją if a nawiasem jej warunku znajduje się spacja. Istniejące niuchacze można bardzo łatwozmodyfikować, aby utworzyć własny nowy standard kodowania.

Dokumentacja i kodDla większości programistów pisanie dokumentacji to prawdziwa katorga. Jednym ze sposobówna ułatwienie sobie tej pracy jest pisanie dokumentacji bezpośrednio wewnątrz kodu, w formiekomentarzy. Dzięki temu patrząc na kod, widzi się od razu jego opis.

Wszystkie funkcje i klasy powinny być opatrzone komentarzami. Gdy wprowadza się jakieś zmianyw kodzie, można na bieżąco odpowiednio zmodyfikować jego dokumentację. Narzędzia weryfi-kujące zgodność ze standardami kodowania informują, gdzie brakuje komentarzy, dzięki czemułatwiej jest pamiętać o konieczności ich wstawienia. 3 http://www.squizlabs.com/php-codesniffer.

Page 19: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 245

Ponieważ składnia komentarzy jest ściśle określona (o czym przekonaliśmy się w części „Weryfi-kacja kodu pod kątem standardów kodowania przy użyciu narzędzia PHP_CodeSniffer”), możnaje pobrać z pliku i zamienić w prawdziwą dokumentację. Oto przykładowa klasa zawierającawszystkie niezbędne komentarze:

/** * klasa Robot * * PHP Version 5 * * @category Example * @package Example * @author Lorna Mitchell <[email protected]> * @copyright 2011 Sitepoint.com * @license PHP Version 3.0 {@link http://www.php.net/license/3_0.txt} * @link http://sitepoint.com */

/** * Robot * * PHP Version 5 * * @category Example * @package Example * @author Lorna Mitchell <[email protected]> * @copyright 2011 Sitepoint.com * @license PHP Version 3.0 {@link http://www.php.net/license/3_0.txt} * @link http://sitepoint.com */class Robot{ protected $x = 0; protected $y = 0;

/** * pobranie typowego komentarza tego znaku * * @return string komentarz */ public function getCatchPhrase() { return 'Oto ja, intelekt przewy�szaj�cy...'; }

/** * Przesuwa znak o losową liczbę znaków. * * @return logiczna wartość true */ public function dance() { $xmove = rand(-2, 2); $ymove = rand(-2, 2); if ($xmove != 0) { $this->x += $xmove;

Page 20: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

246 Mistrz PHP. Pisz nowoczesny kod

} if ($ymove != 0) { $this->y += $ymove; } return true; }}

Większość środowisk programistycznych ma funkcję generowania szkieletu dokumentacji napodstawie deklaracji klas i metod, nazw parametrów itp. Później wystarczy tylko dodać brakująceinformacje dotyczące przeznaczenia zmiennych, ich typów, postaci itd. Narzędzia wspomagające tenproces są bardzo pomocne, zatem nie masz żadnej wymówki, żeby się od ich używania wymigać!

Narz�dzie phpDocumentorNarzędzi do zamiany komentarzy na dokumenty jest wiele. Jednym z nich, mającym ugruntowa-ną pozycję w środowisku, jest program phpDocumentor4, który można zainstalować poprzezbibliotekę PEAR (więcej na ten temat piszemy w dodatku A). Aby wygenerować dokumentacjędla naszego bardzo prostego projektu, instalujemy wymienione narzędzie, a następnie wpisujemyponiższe polecenie:

phpdoc -t docs -o HTML:Smarty:PHP -d .

Pierwsza część polecenia to oczywiście nazwa programu. Za nią znajduje się kilka przełączników.Opcja -t określa katalog, w którym ma zostać zapisany wynik, -o wyznacza szablon, według któ-rego ma zostać utworzona dokumentacja, a -d określa, gdzie znajduje się kod, dla którego ma zo-stać napisana dokumentacja — w tym przypadku jest to bieżący katalog. Po zakończeniu pracyprogramu można otworzyć stronę docs/index.html w przeglądarce internetowej (rysunek 8.1).

Rysunek 8.1. Dokumentacja wygenerowana przez program phpDocumentor

4 http://www.phpdoc.org/.

Page 21: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 247

Zapisane w tym pliku pobrane z kodu informacje można przeglądać na kilka sposobów, np. wedługzawartości plików, jak na rysunku 8.2.

Rysunek 8.2. Widok zawarto�ci pliku w programie phpDocumentor

Informacje można także wyświetlać według klas, jak na rysunku 8.3.

Rysunek 8.3. Widok metod z klasy Robot

Przedstawione przykłady wydają się niezbyt bogate w treść, ale gdyby do narzędzia tego wprowa-dzić jakiś większy program, od razu dałoby się dostrzec wiele szczegółów. Co ważne, nawet gdybykod nie zawierał żadnych komentarzy, phpDocumentor i tak wygenerowałby informacje o klasach,nazwach metod itp. Dzięki temu narzędzie to można wprowadzić do procesu budowy, aby miećzawsze dostępną dokumentację API programu, nad którym się pracuje — w trakcie dalszych pracmożna dodać komentarze dokumentacyjne.

Page 22: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

248 Mistrz PHP. Pisz nowoczesny kod

Program ten bardzo dobrze uzupełnia się z narzędziem PHP_CodeSniffer, które ostrzega o bra-kujących komentarzach. Początkowo komentarzy jest dużo, ale możliwość sprawdzenia stanu rzeczybardzo motywuje cały zespół do pracy.

Inne narz�dzia dokumentacyjneMimo że program phpDocumentor już od wielu lat jest standardowym narzędziem do tworzeniadokumentacji, nie uwzględniono w nim jeszcze nowości wprowadzonych w PHP 5.3. W celu za-pełnienia tej luki pojawiły się nowe narzędzia tego typu, ale żadne z nich nie jest jeszcze wystar-czająco dopracowane, aby można było je uznać za następcę starego programu. Ciekawie zapo-wiada się kilka projektów, np. DocBlox5 i najnowsza wersja narzędzia Doxygen6, warto więc siętrochę rozejrzeć, bo może uda Ci się znaleźć coś, co będzie odpowiadać Twoim wymaganiom.

Kontrola �ród�aŻyczylibyśmy sobie, żeby w każdym projekcie był używany jakiś system kontroli kodu źródłowego,ale na wypadek gdybyś jeszcze niczego takiego nie używał albo był nowicjuszem w branży, w tympodrozdziale opisujemy wszystko od podstaw. Dowiesz się, dlaczego warto kontrolować kod źró-dłowy, jakie są dostępne narzędzia do robienia tego oraz jak utworzyć i skonfigurować repozyto-rium, aby odpowiadało Twoim potrzebom. Treść tej części rozdziału można ogólnie odnieść dowielu narzędzi tego typu, a przykłady tu prezentowane dotyczą systemów Subversion7 i Git8.Panowanie nad kodem źródłowym i innymi zasobami projektu to klucz do sukcesu programisty.W tym podrozdziale znajdziesz wszystkie informacje potrzebne do osiągnięcia tego sukcesu.

Kontrola kodu źródłowego to nie tylko zapisywanie starszych wersji programu (chociaż to równieżsię przydaje, gdy np. zauważysz, że zboczyłeś z kursu, albo klient stwierdzi, że poprzednia wersjaprogramu bardziej mu się podobała). Dla każdej zmiany zapisywane są następujące informacje:

� kto dokonał zmiany,� kiedy miało to miejsce,� co dokładnie zmieniono,� dlaczego to zrobiono9.

Z systemu kontroli kodu źródłowego warto korzystać nawet, gdy pracuje się nad projektem w poje-dynkę, bez współpracy z innymi i bez tworzenia gałęzi. Repozytorium jest także centralnym ma-gazynem kodu. Można w nim przechowywać pliki z kodem, przenosić te pliki na inne komputery,robić kopie zapasowe, używać repozytorium jako mechanizmu wdrażania (więcej na ten temat pisze-my nieco dalej w tym rozdziale) i zawsze będzie wiadomo, że się pracuje na właściwej wersji kodu.

5 http://www.docblox-project.org/.6 http://www.stack.nl/~dimitri/doxygen/index.html.7 http://subversion.apache.org/.8 http://git-scm.com/.9 Chyba że zezwolisz na wiadomości zatwierdzania typu „Poprawione”, które nie są zbyt pomocne.

Page 23: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 249

System kontroli kodu to także ważne narzędzie ułatwiające współpracę. Umożliwia bezproblemowewprowadzanie wielu zmian i uwalnia członków zespołu od konieczności wypytywania wszystkichw biurze, kto ostatnio wprowadził jakieś zmiany w programie, albo nazywania katalogów inicjałamiprogramistów, aby dwie osoby równocześnie nie wprowadzały modyfikacji w tym samym kodzie!

Praca z centralnym systemem kontroli wersjiW tekście pojawiło się kilka nowych słów, które mogą być niezrozumiałe, dlatego poniżej przed-stawiamy definicje kilku pojęć.

repozytorium (ang. repository) Miejsce przechowywania kodu

zatwierdzenie zmian (ang. commit) Zarejestrowanie stanu zmian

pobranie kodu (ang. check out) Pobranie kodu z repozytorium, aby na nim pracować

kopia robocza (ang. working copy) Kod pobrany z repozytorium

Kod może być pobierany z repozytorium przez kilka osób jednocześnie. Każda z nich dokonujew nim zmian, które następnie zatwierdza w repozytorium. Pozostałe osoby aktualizują kod,aby zachować wprowadzone zmiany w swoich kopiach roboczych. Relacje te przedstawiono narysunku 8.4.

Rysunek 8.4. Kopie robocze pobrane z centralnego repozytorium

Czasami praca z systemem kontroli kodu może być trudna, zwłaszcza gdy członkowie zespołu niemają na ten temat wystarczającej wiedzy. Wydaje się wówczas, że system, zamiast pomagać, tylkoprzeszkadza, a tak nie powinno być. Można jednak te kłopoty zminimalizować, postępującwedług prostych wskazówek. Oto kilka porad, które sformułowaliśmy na podstawie własnegodoświadczenia:

� aktualizuj przed zatwierdzaniem;� stosuj standardową konwencję nazywania projektów/gałęzi;� często zatwierdzaj (przynajmniej raz dziennie) i często aktualizuj;� przypominaj cały czas, kto nad czym pracuje (aby uniknąć dublowania pracy i konfliktów).

Wszystko, co zostało do tej pory napisane, to tylko teoria. W następnym podrozdziale przedstawimypraktyczny przykład na podstawie systemu Subversion. Natomiast Git i systemy rozproszone opi-sujemy nieco dalej.

Page 24: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

250 Mistrz PHP. Pisz nowoczesny kod

Kontrola �ród�a przy u�yciu systemu SubversionWiększość organizacji wybiera do kontroli wersji oprogramowania system Subversion. Ostatniomożna zaobserwować wzrost popularności systemów rozproszonych, ale wciąż jest miejsce dlaprostych scentralizowanych narzędzi, zwłaszcza w zespołach, w których są młodzi programiścilub projektanci i większość osób pracuje w jednym miejscu lub w kilku miejscach. W każdym raziesystem Subversion i jego projekt mają się dobrze, a ich twórcy są gotowi na wszystko, aby dostar-czyć produkt najwyższej jakości.

Przejrzymy polecenia, których najprawdopodobniej możesz potrzebować. Przede wszystkimmusisz umieć pobrać kod (ang. check out), sprawdzić nowe zmiany oraz zatwierdzić własnezmiany (ang. commit):

$ svn checkout svn://repo/projectA project/hello.phpChecked out revision 695.

$ svn updateA project/readmeAt revision 697.

$ vim hello.php$ svn statusM hello.php

$ svn commit -m "Fixed bug #42 by changing the wording"Sending hello.phpTransmitting file data .Committed revision 698.

Najpierw pobraliśmy kod, aby mieć jego lokalną kopię roboczą. Jeśli chcesz ustawić jakieś opcjekonfiguracyjne serwera, np. skonfigurować wirtualne hosty, powinieneś to zrobić właśnie teraz.Następne dwie czynności — aktualizacja i zatwierdzanie — są wykonywane wielokrotnie podczaspracy, a dodatkowo od czasu do czasu pobierane są zmiany od innych użytkowników. Po zakoń-czeniu pracy należy wykonać ostateczną aktualizację, aby dokonać synchronizacji z lokalnym re-pozytorium, a następnie zatwierdzić zmiany. Pozostali członkowie zespołu zobaczą Twoje zmiany,gdy dokonają u siebie aktualizacji.

Tak wyglądają podstawowe zasady pracy. W ten sposób można zapanować nad kodem nawetw dużych zespołach programistycznych. Niestety, nie zawsze wszystko idzie tak dobrze! Jeśli dwieosoby dokonają zmian w tej samej części jakiegoś pliku, to Subversion nie będzie wiedział, któraz tych zmian powinna być pierwsza, i poprosi o informację. W tym celu oznaczy plik jako konflikt(ang. conflict).

Przypuśćmy, że mamy plik o nazwie hello.php zawierający następujący prosty kod:

$greeting = "Witaj, �wiecie ";echo $greeting;

Page 25: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 251

Teraz zobaczmy, co się stanie, gdy dwie osoby dokonają zmian powodujących konflikt. Obaj pro-gramiści pobrali kod w wersji pokazanej powyżej. Następnie jeden z nich postanowił zmienićtekst powitania na mniej formalny:

$greeting = "Cze��, przyjacielu ";echo $greeting;

Zmiana ta zostaje zatwierdzona w repozytorium w normalny sposób, ale w międzyczasie innyprogramista również wprowadził modyfikację, tak że kod wygląda teraz następująco:

$message = "Witaj, �wiecie ";echo $message;

Próba zatwierdzenia zmian przez drugiego programistę nie powiedzie się, ponieważ jego pliki będą nie-aktualne. Gdy obaj programiści dokonają aktualizacji, zostaną poinformowani o konflikcie, ponieważzarówno w wersji przychodzącej, jak i w lokalnej kopii roboczej zmodyfikowano ten sam wiersz kodu.

Od Subversion 1.5 możliwe stało się interaktywne rozwiązywanie konfliktów, tzn. można edytowaćplik bezpośrednio podczas jego pobierania. Można także odłożyć zmiany na później i dokończyćaktualizację. W każdym razie w pliku zawierającym konflikty pojawi się następująca informacja:

<<<<<<< .mine$message = "Witaj, �wiecie ";echo $message;=======$greeting = "Cze��, przyjacielu ";echo $greeting;>>>>>>> .r699

Jeśli wykonasz w tym momencie polecenie svn status, zauważysz, że obok pliku hello.phpznajduje się litera C oznaczająca, że wystąpił w nim konflikt. Ponadto pojawią się trzy nowe pliki:hello.php.mine, hello.php.r698 oraz hello.php.r699. Zawierają one odpowiednio: Twój kod w wer-sji sprzed wykonania polecenia svn update, wersję z repozytorium po ostatniej aktualizacji lubostatnim pobraniu oraz najnowszą wersję kodu z repozytorium.

Aby rozwiązać konflikt, należy otworzyć plik i ręcznie usunąć z niego informację o konflikcie, a na-stępnie nanieść w nim odpowiednie poprawki. Po doprowadzeniu kodu do odpowiedniego stanunależy poinformować system o tym fakcie, wysyłając polecenie resolved:

svn resolved hello.php

Spowoduje to usunięcie znacznika oznaczającego konflikt, a także dodatkowo utworzonych plików.Dopóki konflikt nie zostanie rozwiązany, w pliku nie można zatwierdzać żadnych nowych zmian.

Konflikty i zespo�y

Konfliktów nie da si� ca�kiem wyeliminowa�, zw�aszcza bior�c pod uwag� fakt, �e Subversion nie mo�einterpretowa� kodu PHP i nie wie, �e to, co dla niego jest konfliktem na kocu pliku, to w rzeczywisto�cidwie nowe funkcje dodane przez dwie osoby. Je�li zdarzenia takie maj� miejsce bardzo cz�sto, mo�e toby� oznak� s�abej komunikacji mi�dzy pracownikami lub tego, �e zbyt rzadko dokonuj� oni aktualizacjii zatwierdze. Je�li zauwa�ysz, �e w Twoim zespole konflikty wyst�puj� regularnie, przyjrzyj si� zasadompracy i spróbuj poszuka� rozwi�zania, zmieniaj�c jakie� procesy i zwyczaje.

Page 26: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

252 Mistrz PHP. Pisz nowoczesny kod

Projektowanie struktury repozytoriumW repozytorium Subversion można przechowywać wiele projektów, w których zazwyczaj tworzysię następujące katalogi: branches, tags oraz trunk10. W katalogu trunk przechowywana jest głównawersja kodu.

Gałąź (ang. branch) to kopia kodu. Gałęzie tworzy się po to, aby oddzielić pule zmian od pniagłównego (ang. trunk), np. podczas pracy nad ważną funkcją. Bez rozgałęzienia programista pra-cujący nad tą funkcją nie mógłby współpracować z innymi programistami ani zatwierdzać zmianw repozytorium, dopóki nie miałby pewności, że jego funkcja jest gotowa i nie spowoduje uszko-dzenia kodu kogoś innego. Dzięki utworzeniu gałęzi otrzymuje się bezpieczne środowisko pracy,w którym kod można zatwierdzać bez żadnych przeszkód, a także można współpracować z innymitak, jak się chce.

Znacznik (ang. tag) to po prostu czytelna nazwa reprezentująca określony moment w czasiew repozytorium. Znaczników zazwyczaj używa się do oznaczania wybranych wersji, np. tej, którąsię opublikowało.

Istnieje kilka szkół korzystania z katalogów branches i tags. W większości zespołów stosuje się jednoze standardowych rozwiązań lub jego zmodyfikowaną wersję. Zobaczmy, na czym te rozwiązaniapolegają.

Ga��� dla ka�dej wersjiTego typu organizację katalogów stosuje się najczęściej w projektach opakowaniowych i w bi-bliotekach programistycznych. Jest katalog główny, ale wraz z pojawieniem się każdej wersji zo-staje utworzona nowa gałąź. Za każdym razem, gdy wychodzi podwersja, dodaje się znacznik.Przedstawiono to schematycznie na rysunku 8.5.

Rysunek 8.5. Struktura repozytorium z ga��ziami i znacznikami w organizacji katalogów wed�ug wersji programu

10 Jest to tylko zalecany standard, ale nie ma obowiązku tworzenia katalogów branches i tags.

Page 27: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 253

W tym modelu nowe wersje są wyprowadzane w postaci gałęzi. Praca nad nową wersją odbywa sięna pniu, po czym następuje wydanie głównej wersji, a mniejsze wersje i poprawki błędów są roz-mieszczone wzdłuż gałęzi. Gdy w użyciu jest kilka wersji oprogramowania jednocześnie, poprawkiusterek można też połączyć między gałęziami (więcej na temat łączenia piszemy nieco dalej).

Ga��� dla ka�dej funkcjiTę strategię zarządzania najczęściej stosuje się w projektach internetowych, głównie dlatego, żekoszty przesyłania są bardzo niskie (zwłaszcza gdy korzysta się z automatycznych rozwiązańwdrażania, o których będzie mowa w podrozdziale „Automatyzacja procesu wdrażania”). W tympodejściu tworzy się nową gałąź dla każdej nowej funkcji programu. Większość zespołów godzi sięna pewne szybkie poprawki bezpośrednio na pniu, ale tylko wtedy, kiedy dany zespół uważa, żejest to akceptowalne. Struktura repozytorium w tym wypadku wygląda tak jak na rysunku 8.6.

Rysunek 8.6. Repozytorium z ga��ziami utworzonymi dla wi�kszych funkcji

Dla każdej nowej funkcji programu — np. dla opcji logowania do systemu przy użyciu Twittera— tworzona jest nowa gałąź. Później programiści zajmujący się tą funkcją mogą współpracowaćw normalny sposób, aż do jej ukończenia. Następnie można wszystko scalić z pniem.

Page 28: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

254 Mistrz PHP. Pisz nowoczesny kod

Rozproszone systemy kontroli wersjiCoraz częściej zespoły programistyczne — głównie pracujące nad projektami otwartymi, alezdarzają się i komercyjne — decydują się na używanie rozproszonych systemów kontroli wersji.Istnieje sporo programów tego typu, a najważniejsze z nich to:

� Git,� Mercurial11 (znany też pod nazwą Hg, która jest symbolem chemicznym pierwiastka rtęć —

czyli mercury po angielsku),� Bazaar12 (znany też pod nazwą bzr).

Wszystkie wymienione programy mają podobną funkcjonalność i każdy z nich działa na podob-nych zasadach, dlatego też nie będziemy koncentrować się na żadnym konkretnym, lecz opiszemykoncepcje rozproszonej kontroli wersji w ujęciu ogólnym.

Cechą charakterystyczną odróżniającą systemy rozproszone od innych jest brak centralnegopunktu. W systemie znajduje się wiele repozytoriów i każde z nich może wymieniać zatwierdzeniaz pozostałymi. Na rysunku 8.4 przedstawiono schemat scentralizowanego repozytorium. W sys-temie rozproszonym nie pobiera się kodu z centralnego repozytorium, zamiast tego klonuje się jew celu utworzenia nowego własnego repozytorium. Zamiast kopii roboczych wszyscy mają repo-zytoria, a każde z nich jest połączone z wszystkimi pozostałymi. Schematycznie układ ten możnaprzedstawić tak jak na rysunku 8.7.

Rysunek 8.7. Repozytoria typowego systemu rozproszonego

11 http://mercurial.selenic.com/.12 http://bazaar.canonical.com/en/.

Page 29: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 255

Użytkownicy mogą przesyłać zmiany ze swoich repozytoriów do innych oraz pobierać je z innychdo swoich. Daje to szersze pole działania niż w scentralizowanych systemach, ale oznacza rów-nież, że jest więcej rzeczy, które trzeba wiedzieć, przez co nauka korzystania z systemów rozpro-szonych zazwyczaj trwa dłużej. Zwyczajowo jednemu z repozytoriów nadaje się rangę głównego,ale znajduje to odzwierciedlenie tylko w nazwie i nie pociąga za sobą nadania żadnych specjal-nych właściwości. Po prostu głównym repozytorium jest to, które uwzględnia się w wykonywaniukopii zapasowej i którego używa się jako bazy do wdrażania.

Jeśli planujesz zamienić system scentralizowany na rozproszony, musisz pamiętać o kilku istot-nych różnicach między nimi. Po pierwsze, każde zatwierdzenie jest serią zmian (ang. changeset),a nie obrazem (ang. snapshot). Numer wersji oznacza zestaw zmian (coś w rodzaju łatki), a niepełny eksport systemu. Druga ważna różnica dotyczy gałęzi. Ponieważ repozytorium jest przecho-wywane lokalnie, gałęzie możesz tworzyć w nim lokalnie albo oznaczyć je do udostępniania innym.Dlatego można tworzyć gałęzie na własny użytek, łączyć zmiany w udostępnianych gałęziach (alboje wyrzucać), a następnie przekazywać je do innych repozytoriów.

Spo�eczno�ciowe narz�dzia dla programistówNie można przy okazji omawiania narzędzia Git (i podobnych) nie wspomnieć o serwisach inter-netowych, które powstały w związku z nim, np. GitHub13. Są to usługi hostingu systemów kon-troli kodu źródłowego, dzięki którym można śledzić aktywność wybranego programisty albo ca-łych zespołów. Zazwyczaj w serwisach tych udostępniane są strony wiki i podsystemy typu issuetracker, czyli serwisy oferują właściwie wszystko, czego potrzeba do prowadzenia projektu pro-gramistycznego. Jednak najważniejszą cechą systemów rozproszonych, dzięki której zyskały po-pularność, jest możliwość sprawdzenia w dowolnej chwili, kto ma kopie repozytoriów i jakie zmianyten ktoś wprowadza. Ponadto za pośrednictwem serwisów społecznościowych użytkownicy mogąwysyłać do nas żądania pobrania (ang. pull request) — prośby o wciągnięcie dokonanych przeznich zmian do naszej głównej gałęzi. Poza tym wiele z tych serwisów oferuje sieciowy interfejs dowykonywania tego typu scaleń.

Istnieją serwisy internetowe dla wszystkich rodzajów systemów kontroli kodu źródłowego, włączniez Subversion. Są to doskonałe rozwiązania do pracy grupowej, a na dodatek większość z nich oferujedarmowe konta dla projektów open source i płatne do użytku komercyjnego.

Kontrola kodu �ród�owego przy u�yciu narz�dzia GitWcześniej poznaliśmy zasadę działania systemu Subversion. W tej części rozdziału dokonamyporównania tego narzędzia z rozproszonym systemem typu Git. Jedną z różnic między tymitypami rozwiązań jest stosowane nazewnictwo. W systemach rozproszonych repozytoria się klonuje(ang. clone), zamiast pobierać (ang. check out). Jeśli będziesz używać np. usługi GitHub, możesz napoczątku rozwidlić (ang. fork) repozytorium, aby utworzyć własną wersję, która będzie ogólno-dostępna i w której będziesz mógł zapisywać swój kod — następnie klonujesz ją na swój komputer,aby móc na niej pracować. 13 http://github.com/.

Page 30: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

256 Mistrz PHP. Pisz nowoczesny kod

Do klonowania repozytoriów służy polecenie clone. Poniżej znajduje się przykładowe poleceniesklonowania z GitHub repozytorium otwartego projektu joind.in:

$ git clone [email protected]:lornajane/joind.in.gitCloning into joind.in...

Program utworzy na Twoim komputerze nowy katalog o takiej samej nazwie jak repozytorium.Gdy do niego przejdziesz, znajdziesz w nim kompletny kod. Aby pobierać zmiany z innych repo-zytoriów, trzeba wiedzieć, czym są źródła zdalne (ang. remotes). Kontynuując poprzedni przy-kład: chcielibyśmy pobierać zmiany z głównego projektu joind.in z GitHub, z którego utworzyliśmywłasne rozwidlenie repozytorium. W tym celu musimy go dodać jako źródło zdalne, a następniepobrać z niego zmiany:

$ git remote add upstream [email protected]:joindin/joind.in.git$ git remoteoriginupstream

Dodaliśmy główne repozytorium projektu joind.in jako źródło zdalne o nazwie upstream (jest tobardzo przydatny zwyczaj). Gdy wpiszemy polecenie git remote bez żadnych dodatkowych ar-gumentów, otrzymamy listę wszystkich zdalnych źródeł znanych Git, włącznie z naszym źródłemupstream i źródłem origin, czyli tym, z którego je sklonowaliśmy. Aby pobrać zmiany z repozyto-rium upstream, należy użyć polecenia pull:

$ git pull origin master

Argumentami tego polecenia są nazwa źródła zdalnego i nazwa gałęzi, z której chcemy pobraćzmiany. Własnych zmian można dokonywać poprzez standardowe edytowanie plików. Aby jed-nak takie pliki zostały uwzględnione w zatwierdzeniu, w Git trzeba jeszcze je do niego dodać.Za pomocą polecenia git status można sprawdzić, co zostało zmienione, które pliki nie są śle-dzone oraz które zostały dodane do zatwierdzenia przy najbliższej okazji:

$ git status# On branch master# Changes not staged for commit:# (use "git add <file>..." to update what will be committed)# (use "git checkout -- <file>..." to discard changes in working directory)## modified: index.php#no changes added to commit (use "git add" and/or "git commit -a")

$ git add index.php$ git status# On branch master# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## modified: index.php#

$ git commit -m "added comments to index.php"

Page 31: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 257

W tym przykładzie użyliśmy polecenia git status, aby zobaczyć, co zostało zmienione i dowie-dzieć się, co dodaliśmy. Po zatwierdzeniu pliku można się przekonać, że zmiany zostały uwzględ-nione w wyniku polecenia git log, ale nadal są tylko w naszym lokalnym repozytorium. Abyprzesłać je do repozytorium zdalnego (w tym przypadku do repozytorium GitHub), musimy jetam „wepchnąć” za pomocą polecenia git push. Domyślnie wysyła ono zmiany z lokalnego repo-zytorium do tego, którego jest klonem.

Repozytorium jako centrum procesu budowyWiele z narzędzi, które zostały opisane w tym rozdziale, a także narzędzia testowe, najlepiej jestobsługiwać automatycznie. Niektóre na przykład powinny się uruchamiać za każdym razem podokonaniu zatwierdzenia (np. testy i weryfikatory standardów kodowania). Potrzebny Ci też bę-dzie jeden z systemów automatycznego wdrażania (systemom tym poświęcony jest następny pod-rozdział). Dzięki umieszczeniu kodu źródłowego w systemie kontroli źródła wszystkie te narzę-dzia wiedzą, skąd pobierać kod i jak prezentować zmiany w bieżącej wersji.

Automatyzacja procesu wdra�aniaJak wysłać aplikację na platformę użytkową? Wiele osób odpowie, że trzeba użyć FTP albo SVNw celu pobrania na serwer nowych plików. Obie metody mają tę wadę, że powodują niewielkiezakłócenia podczas trwania procesu i nie umożliwiają cofnięcia operacji.

Unikaj artefaktów kontroli �ród�a na platformach u�ytkowych

Podczas wysy�ania plików z systemu kontroli �ród�a na platform� u�ytkow� nale�y zachowa� szczególn�ostro�no��. Systemy te przechowuj� informacje o zmianach lokalnie, wi�c gdyby Twój serwer udost�pnia�je publicznie, móg�by� przez przypadek udost�pni� wi�cej informacji o swoim kodzie, ni� by� chcia�. Je�li naprzyk�ad u�ywasz systemu Subversion, to do wirtualnego hosta albo pliku .htaccess musisz doda� regu��zabraniaj�c� serwowania wszelkich plików zawieraj�cych w �cie�ce ci�g .svn.

Natychmiastowe prze��czanie na now� wersj�Lepszym rozwiązaniem kwestii wdrażania jest skonfigurowanie hosta tak, aby odwoływał się dodowiązania symbolicznego (symlink14) zamiast do zwykłego katalogu. Następnie wyślij kod naserwer i ustaw dowiązanie na jego katalog. Gdy będziesz gotów do wdrożenia nowej wersji, wyślijnowy kod na serwer i przygotuj go. Jeśli musisz skopiować albo dołączyć jakieś inne pliki konfi-guracyjne lub zrobić cokolwiek innego, jest to odpowiedni moment na wykonanie tych czynności.Gdy wszystko będzie już gotowe, możesz po prostu przestawić dowiązanie symboliczne na nowykod, nie powodując ani chwili przestoju.

Stosując tę metodę, masz również możliwość wycofania zmian. Jeśli stanie się coś nieprzewidy-walnego i będzie trzeba wrócić do poprzedniej wersji aplikacji, wystarczy tylko przestawić dowią-zanie symboliczne na stary katalog. 14 http://php.net/manual/en/function.symlink.php.

Page 32: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

258 Mistrz PHP. Pisz nowoczesny kod

Zarz�dzanie zmianami w bazie danychJest to wyjątkowo trudna kwestia i mimo że bardzo byśmy chcieli przedstawić jakieś doskonałerozwiązanie, tak naprawdę nie ma metody odpowiedniej dla każdego przypadku. Większość roz-wiązań działa na podobnej zasadzie, tzn. polega na zapisywaniu ponumerowanych łatek do bazydanych, zapamiętywaniu, jaki numer w danej chwili nas interesuje, i zestawieniu tych dwóch warto-ści podczas aktualizacji wersji.

Wyjaśnimy to na przykładzie prostej bazy danych, której definicja znajduje się na poniższym listingu:

-- init.sqlCREATE TABLE categories(id int PRIMARY KEY auto_increment,name VARCHAR(255));

-- seed.sqlINSERT INTO categories (name) values ('Kids');INSERT INTO categories (name) values ('Cars');INSERT INTO categories (name) values ('Gardening');

Gdybyśmy chcieli zmienić schemat tej bazy, najpierw musielibyśmy opracować jakiś sposób za-rządzania danymi tej aktualizacji. W tym przykładzie struktury łatki zostaną dodane jako samałatka, dzięki czemu możesz to rozwiązanie wykorzystać we własnej bazie danych, jeśli chceszzacząć formalne zarządzanie jej modyfikacjami. Najpierw tworzymy tabelę aktualizacyjną w plikuo nazwie patch00.sql:

CREATE TABLE patch_history (patch_history_id int primary key auto_increment,patch_number int, date_patched timestamp);

INSERT INTO patch_history SET patch_number = 0;

Teraz utworzymy pierwszą łatkę (w pliku patch01.sql), na podstawie której zilustrujemy sposóbużycia tabeli patch_history:

ALTER TABLE categories ADD COLUMN description varchar(255);

INSERT INTO patch_history SET patch_number = 1;

Utworzyliśmy tabelę o nazwie patch_history, w której będzie można znaleźć informacje dotyczącetego, które łatki zostały zastosowane i kiedy to zrobiono. Są to bardziej precyzyjne dane niż tylkoinformacje o aktualnym poziomie łatki, które mogą być przydatne, gdy na przykład wprowadzeniektórejś z łatek nie powiodło się, a my dowiedzieliśmy się o tym dopiero po jakimś czasie. Umiesz-czając instrukcje dotyczące historii łatek na końcu plików z łatkami, mamy pewność, że będą onezastosowane tylko wtedy, kiedy pozostałe instrukcje zostaną wykonane pomyślnie.

W powyższym przykładzie wykonywana jest instrukcja ALTER TABLE. Dzięki umieszczeniu koduSQL w plikach łatek i uruchomieniu tych ostatnich na roboczej bazie danych uzyskuje się zapiswszystkich dokonanych zmian. Jest to bardzo ważne, aby móc potem replikować te zmiany nainnych platformach — zarówno roboczych, jak i produkcyjnych.

Page 33: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 259

Jednym z najważniejszych aspektów zarządzania modyfikacjami bazy danych jest szansa cofnięciaoperacji — powinno się mieć możliwość zarówno cofania zmian, jak i ich dokonywania. Trudnośćtę można w prosty sposób rozwiązać, pisząc dla każdej zmiany po dwie instrukcje SQL — jednądo wykonania zmian, drugą do ich cofania. Niestety, nie zawsze jest to możliwe, ponieważ np. in-strukcje usuwania kolumn i ogólnie operacje powodujące usunięcie czegoś nie mogą być cofnięte.

Istnieje wiele narzędzi wspomagających zarządzanie zmianami baz danych. Można je znaleźć za-równo w niektórych frameworkach, jak i w narzędziach wdrożeniowych. Niezależnie jednak odtego, na co się zdecydujesz, pamiętaj, że system jest tak dobry jak dostarczane do niego informa-cje — jego działanie w pełni zależy od tego, czy zostaną mu przekazane pełne i poprawne zestawyłatek wraz z poprawnymi danymi dotyczącymi historii zmian.

Automatyzacja wdra�ania i plik konfiguracyjny PhingKilka razy wspomnieliśmy o automatyzacji procesu wdrażania. Teraz opiszemy dokładnie, jak tozrobić. Rozwiązanie tego typu trzeba zawsze dokładnie przemyśleć i zaplanować, ale gdy się już jeskonfiguruje, pozwala ono zaoszczędzić wiele czasu i uniknąć niejednego błędu. Zastanów się nadnastępującymi kwestiami:

� Ile czasu zajmuje wdrażanie bazy kodu?� Jak często popełniasz przy tym błędy?� Jak często wdrażasz kod?� Jak często byś to robił, gdyby to trwało krótko i nie było kłopotliwe?

Większość zespołów programistycznych zbyt nisko szacuje ilość czasu, jaki spędza na wdrażaniu(dla zabawy oszacuj, ile czasu zajmuje to Tobie, a następnie zmierz rzeczywisty czas podczas naj-bliższego wdrażania), i nie zdaje sobie sprawy ze szkód, jakie niosą błędy popełnione podczas wy-konywania procesów, w których kilka czynności musi zostać wykonanych w ściśle określonymporządku. Zastosowanie wypróbowanego i przetestowanego procesu wdrażania aplikacji pozwalapozbyć się wielu potencjalnych problemów, a co więcej, jako że wdrażanie to już faza utrzymaniaprogramu, umożliwia zmniejszenie kosztów.

Najprostszy system automatycznego wdrażania składa się z szeregu skryptów, które wykonująpodstawowe zadania. Typowy skrypt może działać według następującego schematu:

1. Oznakowanie i eksport kodu z systemu kontroli wersji. 2. Kompresja kodu do pliku TAR, przesłanie go na serwer i dekompresja. 3. Zastosowanie łatek do bazy danych, jeśli jest taka potrzeba. 4. Utworzenie łączy do elementów projektu znajdujących się poza katalogiem głównym, np.

katalogów do odbierania plików wysyłanych przez użytkowników czy do plików konfigu-racyjnych.

5. Przestawienie dowiązania symbolicznego na nową bazę kodu. 6. Opróżnienie buforów i ponowne uruchomienie serwerów. 7. Wizyta w barze i wypicie piwa.

Page 34: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

260 Mistrz PHP. Pisz nowoczesny kod

Sposobów realizacji tego rozwiązania jest wiele: od własnoręcznie napisanych skryptów powłoki,po płatne oprogramowanie pisane na zamówienie. W ramach przykładu przedstawimy Phing15,narzędzie napisane w PHP przeznaczone do pracy z projektami w tym języku. Program ten mawiele wtyczek usprawniających jego działanie oraz zawiera własne narzędzie do zarządzania baządanych, o nazwie dbdeploy.

Plik konfiguracyjny Phing ma format XML i domyślnie nosi nazwę build.xml. Należy w nim wpi-sać nazwę projektu i zdefiniować serię zadań tego projektu. Można także zaznaczyć, które z nichmają być wykonywane domyślnie. Na poniższym listingu znajduje się zawartość przykładowegopliku konfiguracyjnego z dokumentacji Phing:

<?xml version="1.0" encoding="UTF-8"?>

<project name="FooBar" default="dist">

<target name="prepare"> <echo msg="Making directory ./build" /> <mkdir dir="./build" /> </target>

<target name="build" depends="prepare"> <echo msg="Copying files to build directory..." />

<echo msg="Copying ./about.php to ./build directory..." /> <copy file="./about.php" tofile="./build/about.php" />

<echo msg="Copying ./contact.php to ./build directory..." /> <copy file="./contact.php" tofile="./build/contact.php" /> </target>

<target name="dist" depends="build"> <echo msg="Creating archive..." />

<tar destfile="./build/build.tar.gz" compression="gzip"> <fileset dir="./build"> <include name="*" /> </fileset> </tar> <echo msg="Files copied and compressed in build directory OK!" /> </target></project>

Kod ten jest bardzo przejrzysty, mimo że napisany w formacie XML. Najpierw tworzy się elementproject i ustawia w nim domyślny cel. Następnie definiuje się cele dla projektów: prepare, buildoraz dist. Domyślny cel to dist i jeśli zależy on od jakichś innych celów, to najpierw zostanąwykonane właśnie one.

15 http://phing.info/.

Page 35: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

KONTROLA JAKOCI 261

Przechowywanie skryptów wdro�enia w kodzie

Dla ka�dego projektu musi by� utworzony osobny plik build.xml, je�li jednak tworzysz podobne serwisy,to zapewne w ka�dym z nich zastosujesz ten sam szkielet. Dobrym zwyczajem jest umieszczenie konfigu-racji wdra�ania w kodzie, poniewa� baza ta nale�y do projektu. Jest jego sk�adnikiem, podobnie jak �atkido bazy danych, ale umieszczonym poza katalogiem g�ównym dokumentów.

Aby użyć narzędzia Phing, należy zastosować polecenie phing. Jeśli nie zostaną podane żadne ar-gumenty, program wykona domyślny cel. Jeśli poda się konkretny cel, zostanie on wykonanyzamiast domyślnego, np.:

phing prepare

Istnieje bardzo wiele gotowych zadań dla programu Phing, których, po uprzedniej konfiguracji,można użyć na swoim serwerze w celu dostosowania do własnych potrzeb. Narzędzie Phing po-trafi uruchamiać testy jednostkowe, weryfikować standardy kodowania oraz używać większościinnych narzędzi do analizy statycznej kodu. Można także za pomocą znacznika exec wykonaćdowolne polecenie wiersza poleceń. Dzięki temu narzędzie to da się dostosować do potrzeb każ-dego projektu.

Gotowi do wdra�aniaW tym rozdziale opisaliśmy narzędzia do kontroli wersji i standardów kodowania oraz systemyautomatycznego wdrażania aplikacji na serwerze. Poruszyliśmy też temat ciągłej integracji i ser-wera budowy. Każdy zespół programistyczny zapewne skorzysta z mieszanki przedstawionych turozwiązań, aby skonfigurować odpowiednie środowisko pracy, przystosowane do potrzeb projektui do osób, które będą nad nim pracować.

Narzędzia, których opis znajduje się powyżej, pomogą Ci w większości prac, ale zastosowanie ichwszystkich naraz może być bardzo trudne. Dlatego najlepiej zrobisz, jeśli przejrzysz ten rozdziałjeszcze raz i na początek wybierzesz tylko jedno z przedstawionych rozwiązań. Po pół roku, gdy nowyskładnik już się „zaaklimatyzuje”, wybierz coś innego i powtórz czynności, które opisaliśmy.

Page 36: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

262 Mistrz PHP. Pisz nowoczesny kod

Page 37: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

Skorowidz

$_COOKIE, 157$_GET, 109$_GET, 88, 109, 157$_POST, 88, 109, 157$_REQUEST, 157$_SERVER, 88$_SERVER['HTTP_HOST'], 152$_SERVER['PHP_SELF'], 155$_SESSION, 157$captureScreenshotOnFailure, 232$db_conn, 54$this, 21, 23.htaccess, 108, 257

Aab, 233, 235AcceptPathInfo, 154, 155adres IP, 169

fałszowanie, 162Ajax, 100, 102aktualizacja, 250alpha, 276ALTER TABLE, 66, 258analiza statyczna kodu, 237Apache, 141, 154, 171, 175, 233ApacheBench, 173APC, 181, 186, 201, 203API, 75, 185, 247

Flickr, 97APT, 263architektura usługowa, 76archiwum kodu, 16asercja, 207, 221, 230atak siłowy, 167auto_increment, 52autoloader, 208automatyczna inkrementacja, 52automatyczne ładowanie, 22AVG, 71AWS, 213

BBazaar, 254BDD, 214, 217Behat, 214benchmark, 173, 179beta, 276bezpieczeństwo aplikacji, 152bezstanowy, 50brute force attack, 167bufor, 187

czyszczenie, 192buforowanie, 89, 185

CCAPTCHA, 169cechy, 119Charles Proxy, 96ciasteczko, 154, 170, 171, 176CMS, 49cofnięcie operacji, 259COUNT, 71, 126CPU, 195, 199cross-site Request Forgery, 156cross-site scripting, 153CRUD, 106, 126CSRF, 156, 159CSS, 171, 220, 228CSV, 201, 223, 243cURL, 83, 95

DDELETE, 59, 113deserializacja, 47destruktor, 21dev, 276Development Guide, 172diagnozowanie, 231DocBlock, 228

@scenario, 216

Page 38: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

294 Mistrz PHP. Pisz nowoczesny kod

DocBlox, 248dokumentacja

generowanie, 246pisanie, 244

DOM, 79, 220do-while, 126dowiązanie symboliczne, 257, 259Doxygen, 248Drupal, 199, 203DSL, 214DSN, 53dublery, 211dziedziczenie, 27

Eegzemplarz, 20EXPLAIN, 65, 67eXtensible Markup Language, 79eZ Components, 268

FFacebook, 171, 173Fail2ban, 169FIFO, 287filtrowanie, 152final, 213Firefox, 170, 233Firesheep, 170, 171Flickr, 97, 146foreach, 126FTP, 257funkcja

__autoload(), 282anonimowa, 136apc_exists(), 186apc_fetch(), 186apc_store(), 186array_walk(), 44assert(), 208auto_append_file, 194auto_prepend_file, 194, 198count(), 37date(), 81error_log(), 95eval(), 240GETAction(), 110hash_algos(), 166

json_decode(), 77, 109json_encode(), 77md5(), 166mysql_escape_string(), 57mysql_fetch_array(), 143ob_flush(), 89preg_match(), 143print_r(), 98rand(), 42rdzenna, 221session_regenerate_id(), 160set_error_handler(), 43, 44set_exception_handler(), 43simplexml_load_file(), 81simplexml_load_string(), 81sprintf(), 150urlSimilartor, 199var_dump(), 22, 47

Ggałąź, 252

dla każdej funkcji, 253dla każdej wersji, 252

GET, 82, 91, 175, 177, 200Git, 248, 249, 254, 255, 256GitHub, 197, 255, 256Gluster, 186Google Groups, 291Google+, 173graficzny interfejs użytkownika, 175GROUP BY, 72GUI, 201

Hhartowanie kodu, 76hermetyzacja, 19HMAC, 167Horde, 268HTML, 17, 77, 102

struktura, 154htmlentities(), 155HTTP, 82, 233, 235

kod statusu, 87żądanie, 177

HTTPS, 171

Page 39: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

SKOROWIDZ 295

Iidentyfikator sesji, 159iframe, 104indeks, 65index.php, 108INNER JOIN, 69INSERT, 58, 59instrukcja preparowana, 55, 164interfejs, 37

ArrayAccess, 281Countable, 37, 285Trackable, 38, 39

IRC, 290, 291iterator, 281, 282

FilterIterator, 130LimitIterator, 131, 133łączenie, 132OuterIterator, 128, 132RecursiveIterator, 129RecursiveIteratorIterator, 133RegexIterator, 131

JJava, 180, 221, 243

serwer, 226JavaScript, 77, 114, 171, 228

Object Notation, 77język

kompilowany, 180skryptowy, 179specjalistyczny, 214

JMeter, 173, 175jQuery, 102, 228, 229JSON, 77, 99, 100, 102, 114, 187

Kkanał, 279katalog trunk, 252KCachegrind, 192KISS, 114klasa, 20

Courier, 20, 25, 27DirectoryIterator, 283Exception, 40FileSystemIterator, 283My_Calculator, 209

Parcel, 29PDOStatement, 54, 56, 165PigeonPost, 30RecursiveDirectoryIterator, 283RecursiveIteratorIterator, 283Registry, 121SoapClient, 93SplFileInfo, 283SplFileObject, 284SplHeap, 287SplQueue, 287SplStack, 287SplTempFileObject, 284

klauzula finally, 40klucz

główny, 51obcy, 67

kod operacyjny buforowanie, 180kolejka, 287komentarze, 244

generowanie, 246kompilacja, 264kompilator, 180konflikt, 250konstrukcja try-catch, 40konstruktor, 21kontroler, 140kopia robocza, 249

LLEFT JOIN, 70LIFO, 287LIMIT, 126, 131localhost, 53lokalizatory, 228losowa wartość, 158

łańcuchy wywołań, 32łatka, 258

MMac OS X, 193maszyna wirtualna, 180MAX, 71MD5, 166

Page 40: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

296 Mistrz PHP. Pisz nowoczesny kod

Memcached, 184, 186Mercurial, 254metadane, 187metapakiety, 280metoda, 20

__autoload(), 22__call(), 45, 228__callStatic(), 46__clone(), 32__construct(), 20__destruct(), 21__get(), 36__getFunctions(), 95__set(), 36__toString(), 46add(), 213assertEquals(), 207assertNotTitle(), 229assertTiel(), 229bindParam(), 58bindValue(), 58calculateShipping(), 34DBConnection::getInstance(), 124equalTo(), 212errorInfo(), 62execute(), 56, 58, 165fetch(), 62fetchAll(), 54GET, 157getConnection(), 222getDataSet(), 223, 225getLog(), 125getShippingRateForCountry(), 34getTitle(), 229getTrackInfo(), 38magiczna, 21method(), 212onSetUp(), 231onTearDown(), 231open(), 227PDO::beginTransaction(), 63PDO::commit(), 63PDO::prepare(), 56, 60PDO::query(), 54PDO::rollback(), 63PDOStatement::bindParam(), 58PDOStatement::bindValue(), 57PDOStatement::errorInfo(), 62PDOStatement::fetch(), 54

POST, 158prepare(), 56, 61, 165render(), 149reset(), 127rewind(), 127rowCount(), 59runGiven(), 215runThen(), 215runWhen(), 215setBrowser(), 227setBrowserUrl(), 227setHost(), 226setPort(), 226setSetUpOperation(), 231setTearDownOperation(), 231setTimeout(), 227setUp(), 212, 219, 225, 231ship(), 20sizeof(), 285sprawdzająca, 35statyczna, 23tearDown(), 225, 231testActionGet(), 219testDoStuff(), 225ustawiająca, 35waitForPageToLoad(), 230will(), 212

metodyka czarnej skrzynki, 218MIN, 71Mockery, 213mod_rewrite, 141, 171model, 148modyfikator

dostępu, 33private, 33, 34protected, 34public, 33

MVC, 139, 217MySQL, 49, 51, 70, 124, 186

klient, 51MySQLi, 197

Nnagłówek

Accept, 90Content-Type, 90Expires, 187HTTP Location, 159

Page 41: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

SKOROWIDZ 297

Last-Modified, 187Timestamp, 199

nagłówki żądań, 162narzędzie

ab, 233Checkstyle, 243dbdeploy, 260Phing, 260PHP_CodeSniffer, 241, 244, 248phpcpd, 239phpDocumentor, 246, 247phploc, 238phpmd, 240phpunit, 209xhprof.profile, 194

negocjacja treści, 90Netflix, 212new, 21NFS, 186niuchacz pakietów, 170normalizacja danych, 72NoSQL, 50, 184

Oobiekt, 20

dopasowujący, 212PDOStatement, 61

OFFSET, 126onclick, 102, 133onload, 133onmouseover, 133OOP, 19opcja

apc.stat, 183servername, 198

open source, 239, 255operator

instanceOf, 39obiektowy, 23przestrzeni nazw, 25zakresu, 23

Ppacket sniffer, 170parsowanie, 180partycja, 186PCRE, 143, 153

PDO, 40, 49, 53, 60, 65, 165, 222PEAR, 206, 208, 241, 244, 246, 263, 276, 278, 280

instalowanie rozszerzeń, 268kanał, 265, 266, 277menedżer pakietów, 263tworzenie pakietów, 272

PECL, 181, 193, 263ręczne instalowanie rozszerzeń, 269

Phake, 213Phing, 259, 260, 261

konfiguracja, 260PHP

Architect, 289Planet, 289strumienie, 86

php.ini, 183, 184PHP_CodeSniffer, 244PHPDeveloper, 289phploc, 238PHPMachinist, 221phpMyAdmin, 51phpQuery, 220PHPSpec, 214PHPT, 205PHPUnit, 205, 206, 212, 214, 220, 221, 222, 224,

230, 268pień główny, 252Pirum, 277plik make, 271płatności online, 172płynny interfejs, 32płytkie kopiowanie obiektów, 32PNG, 232pobranie kodu, 249polecenie

channel-info, 266clone, 256config -set, 265config -show, 265configure, 270COUNT(), 72git log, 257git push, 257git remote, 256git status, 256mysqldump, 224pear package, 275phing, 261phpcs, 244

Page 42: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

298 Mistrz PHP. Pisz nowoczesny kod

poleceniephpize, 193phpunit, 208pull, 256resolved, 251svn status, 251svn update, 251

Polimorfizm, 29POST, 91, 97, 98, 109, 111, 168, 177, 200, 201późne ładowanie, 118private, 33, 213procedury składowane, 64profilowanie, 192programowanie

obiektowe, 13, 19oparte na testach, 213oparte na zachowaniach, 214

protected, 33przechowywanie

danych, 50haseł, 165

przekazywanie przez referencję, 31przestrzenie nazw, 24public, 23, 33PUT, 109, 112Pyrus, 280

QQCachegrind, 192

RRAID, 185rainbow tables, 166RAM, 185raport, 243

pokrycia kodu, 210reCAPTCHA, 169referencja, 31regexp, 229regexpi, 229rekurencja, 128repozytorium, 248, 249

główne, 255klonowanie, 255rozproszone, 254rozwidlenie, 255scentralizowane, 249

require, 22

REST, 92, 106RESTful, 106, 107, 111, 243RewriteCond, 141RewriteRule, 141RIGHT JOIN, 70router, 139rozszerzenie

Database, 221, 230DbUnit, 221JUnit, 221memcache, 184pecl_http, 85, 108Xdebug, 192, 210, 271

RPC, 92

SSamba, 186SAN, 186SCSI, 185Secure Socket Layer, 171SELECT, 58, 67Selenium, 220, 226, 227, 228, 229, 231, 233

IDE, 233Selenium RC, 226Selenium Server, 226serializacja, 46, 47serwer, 233sesja, 159, 176

identyfikator, 160przechwycenie, 159uprowadzenie, 161

sessionfixation, 159hijacking, 161

session.cookie_httponly, 162Set-Cookie, 83SHA-1, 166, 186SHA-256, 166Siege, 234, 235

plik konfiguracyjny, 235SimpleTest, 205SimpleXML, 79SimpleXMLElement, 98skalowanie, 204skrypt pośredniczący, 104słowo kluczowe

clone, 32extends, 28

Page 43: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

SKOROWIDZ 299

public, 33throw, 41trait, 120use, 120

SOA, 76SOAP, 82, 92, 114sól, 166SPL, 126, 281, 282spoofing, 162SQL, 185

injection, 163, 165zapytanie, 163, 204

SQLite, 124Squiz, 244SSL, 170

certyfikat, 171stable, 276Stack Overflow, 292Standard PHP Library, 126static, 23, 213sterta, 287stopniowe ulepszanie, 102stos, 287struktura

klas, 26SplDoublyLinkedList, 286SplPriorityQueue, 288

Subversion, 248, 249, 250, 255, 257SUM, 71SVN, 257symbol zastępczy, 56Symphony, 268system kontroli kodu, 249

Ttabela aktualizacyjna, 258tablica, 286TAR, 259, 272testowanie

jednostkowe, 205obciążeniowe, 173, 233systemowe, 226

testyfunkcjonalne, 218jednostkowe, 218

tęczowe tablice, 166token CSRF, 158transakcja, 63

try-catch, 40Twitter, 253, 290tworzenie

makiety, 212zaślepki, 212

UUML, 27Uncaught Exception, 43UPDATE, 58, 59usługa sieciowa, 75, 77

WW3C, 229warstwa abstrakcji, 53wąskie gardło, 192wątki, 174wdrażanie, 259Web Developer, 170WebCacheGrind, 193wersja kodu, 252weryfikacja, 152Wget, 270WHERE, 67, 164widok, 149wiki, 255WinCache, 183Windows, 193Wireshark, 96wirtualny host, 250, 278własność, 20

statyczna, 23WordPress, 238, 239, 240WSDL, 94wskazywanie typów parametrów, 29wydajność, 286wyjątek, 40, 41

PDOException, 54, 60wyrażenia regularne, 153wzorzec

fabryka, 124iterator, 125model-widok-kontroler, 139obserwator, 133rejestr, 120singleton, 118wstrzykiwanie zależności, 136

Page 44: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim

300 Mistrz PHP. Pisz nowoczesny kod

XXampp, 53XHGui, 192, 197, 199, 201XHProf, 192, 193, 204, 264XML, 17, 77, 79, 98, 223, 239, 243, 260

Flat, 223MySQL, 223YAML, 223

XML_Parser, 265XML-RPC, 114XPath, 220, 228, 229XSS, 153, 161, 163

YYUM, 263

Zzamknięcie, 136zasada tej samej domeny, 100zatwierdzanie, 250

zmian, 249

Zend, 244Zend Engine, 180Zend Framework, 24, 217, 220, 244, 268Zend_Dom_Query, 220złączenia

wewnętrzne, 69zewnętrzne, 70

zmienne superglobalne, 88znacznik, 252zrzut ekranu, 231

źródła zdalne, 256

żądania, 174

na sekundę, 234żądanie pobrania, 255

Page 46: Mistrz PHP. Pisz nowoczesny kod - Helionpdf.helion.pl/misphp/misphp.pdfTen rozdział jest kontynuacją opisanego w poprzednim rozdziale tematu automatyzacji testów. Poznasz w nim