Certyfikat ZendPHP

Format I Typ Danych

Ta sekcja jest podzielona na sześć ogólnych obszarów:

•  XML
•  SOAP
•  Usługi sieciowe REST
•  JSON
•  Data i godzina
•  Struktury danych PHP SPL

Chociaż ten temat nie jest jednym z trzech obszarów o dużym znaczeniu dla egzaminu Zend, możesz spodziewać się kilku stosunkowo szczegółowych pytań z tej sekcji.

XML

XML oznacza eXtensible Markup Language i jest sposobem przechowywania danych w uporządkowany sposób. Zaletą korzystania z XML jest to, że jest to dobrze znany standard danych, a więc wygodny sposób wymiany danych między systemami. W branży nastąpiło odejście od XML-a w kierunku JSON jako procesu wymiany danych, ale XML jest nadal istotny w codziennej praktyce i jest częścią badania Zend

Podstawy XML

To nie jest tekst wprowadzający na temat PHP, więc nie przedstawię wszystkich elementów XML w dręczących szczegółach. Ta książka byłaby o wiele za długa, gdybyśmy zagłębili się w ten poziom szczegółowości. Upewnij się, że znasz przynajmniej wszystkie warunki z poniższej tabeli, ponieważ będziemy ich używać podczas analizy możliwości przetwarzania XML w PHP.

Termin : Opis

SGML : Standardowy ogólny język znaczników. XML jest jego podzbiorem.
Document Type Declaration : DTD definiuje elementy składowe dokumentu XML, ze strukturą legalnych elementów i atrybutów.
Jednostka : Jednostka może zadeklarować nazwy i wartości, które są niedozwolone dla reszty dokumentu XML. Na przykład HTML deklaruje < jako byt reprezentujący symbol mniejszy niż <. Te deklaracje mogą mogą być również używane jako skróty i w celu zachowania spójności pisowni i wartość w całym dokumencie.
Element : Elementy to podstawowe elementy składowe dokumentu XML. Elementy mogą być zagnieżdżone i zawierać elementy lub mogą zawierać wartość. Elementy mogą mieć atrybuty.
Dobrze uformowany : Dobrze uformowany dokument w formacie XML to dokument zgodny z regułami składniowymi określonymi przez specyfikację XML 1.0, ponieważ musi spełniać zarówno fizyczne, jak i logiczne struktury .
Walidacja : Dokument XML sprawdzony pod kątem DTD jest zarówno "dobrze sformułowany" i "Walidowany".

Jeśli w ogóle nie rozumiesz tych definicji, zapoznaj się z obszernym samouczkiem na temat XML i zapoznaj się z przypisami z tej sekcji.

Dobrze sformułowany i ważny

Pozwól mi rozwinąć znaczenie tych terminów, ponieważ jest to ważne dla różnicy. Dokument jest dobrze sformułowany, jeśli:

•  Ma jeden element główny
•  Znaczniki są poprawnie otwierane i zamykane
•  Wszystkie podmioty są dobrze uformowane, zgodnie z poniższą listą:
•  Zawierają tylko poprawnie zakodowane znaki Unicode
•  Brak znaków składni, takich jak •  Nazwy znaczników muszą być dokładnie do\pasowane i nie mogą zawierać symboli

Dokument jest ważny, jeśli jest dobrze sformułowany i zgodny z DTD.

Uwaga : PHP nie wymaga, aby dokumenty XML były ważne, ale wymaga, aby były dobrze uformowane, aby parsować je za pomocą standardowych bibliotek.

Instrukcje przetwarzania XML

Instrukcje przetwarzania pozwalają dokumentom zawierać instrukcje dla aplikacji. Są one ujęte w znaki i wyglądają tak, na przykład:

< ? PITarget PIContent? >

Jednym z przypadków użycia może być poinformowanie aplikacji, że element ma być określonym typem danych, jak w tym przykładzie:

< ? var type = "string"? >

Najczęstszym zastosowaniem jest dołączenie arkusza stylów XSLT lub CSS, na przykład:

< ? xml-stylesheet type = "text / xsl" href = "style.xsl"? >
< ? xml-stylesheet type = "text / css" href = "style.css"? >

Transformacje XML z PHP XSL

Rozszerzenie PHP XSL umożliwia PHP stosowanie transformacji XSLT. Chociaż jest to powszechnie stosowane do stosowania arkuszy stylów, ważne jest, aby wiedzieć, że możliwe jest wiele innych form transformacji. XSL to język do wyrażania arkuszy stylów dla dokumentów XML. To jest jak CSS, ponieważ opisuje, jak wyświetlić dokument XML. XSL definiuje XSLT, który jest językiem transformacji dokumentów XML, który umożliwia przetwarzanie dokumentów XML na inne dokumenty. Procesor XSLT pobiera wejściowy plik XML, trochę kodu XSLT i tworzy nowy dokument. Przykładem tego może być utworzenie dokumentu XHTML, który może być renderowany przez przeglądarkę. Wejściowy XML zostałby odebrany z programu PHP, który zawiera instrukcje przetwarzania dotyczące tego, gdzie pobrać arkusz stylów XSL. Przeglądarka pobierze ten arkusz stylów i zastosuje w nim kod XSLT, aby wygenerować XHTML.

Skrót : Co to jest

XSL : Język do wyrażania arkuszy stylów
XSLT : Język transformacji do przetwarzania XML na inny dokument XML

Podręcznik PHP zawiera prosty przykład użycia PHP do transformacji pliku XML przy użyciu XSL:

< ?php
$xslDoc = new DOMDocument();
$xslDoc->load("collection.xsl");
$xmlDoc = new DOMDocument();
$xmlDoc->load("collection.xml");
$proc = new XSLTProcessor();
$proc->importStylesheet($xslDoc);
echo $proc->transformToXML($xmlDoc);

Parsowanie XML w PHP

Istnieją dwa typy parserów XML dostępnych w PHP. Istnieje kilka rozszerzeń PHP, które analizują XML, ale wszystkie należą do jednego z tych dwóch typów. Wszystkie rozszerzenia PHP XML używają tej samej podstawowej biblioteki, więc możliwe jest przesyłanie danych między nimi. Wszystkie procedury XML wymagają włączenia zarówno rozszerzenia LibXML, jak i biblioteki Expat. Oba są domyślnie włączone w PHP.

Parsery drzewa

Parsery drzewa próbują parsować cały dokument naraz i przekształcać go w strukturę drzewa. Powinno być jasne, że może to stanowić problem, jeśli próbujesz przeanalizować bardzo duży dokument. W PHP są dwa parsery drzew:

•  SimpleXML
•  DOM

Parsery oparte na zdarzeniach

Te parsery są szybsze i zużywają mniej pamięci niż parsery drzewa. Działają, czytając dokument XML węzeł po węźle i zapewniając możliwość zaczepienia się o zdarzenia związane z tym procesem odczytu. Dwa przykłady parserów opartych na zdarzeniach to:

•  XMLReader
•  Parser XML Expat

Analizator składni XML Expat to analizator oparty na zdarzeniach, który nie jest walidowany i jest wbudowany w rdzeń PHP. Nie wymaga DTD, ponieważ nie sprawdza poprawności XML i wymaga jedynie poprawnego sformatowania XML.

Kody błędów

Podręcznik PHP wymienia kilka kodów błędów XML. Ta lista jest podzbiorem 733 kodów błędów podstawowej biblioteki libxml. Oto częściowa lista stałych XML, które powinieneś znać, ponieważ są one bardziej powszechne niż inne kody.

Kodu prefiksu : Opis

XML_ERROR_SYNTAX : XML nie jest poprawnie sformułowany.
XML_ERROR_INVALID_TOKEN : Używasz nieprawidłowego znaku w XML.
XML_ERROR_UNKNOWN_ENCODING : Nie można przeanalizować kodu XML, ponieważ nie można ustalić schematu kodowania.
XML_OPTION_CASE_FOLDING : Domyślnie włączone i ustawia nazwy elementów na duże litery.
XML_OPTION_SKIP_WHITE : Pomija nadmiar białych znaków w dokumencie źródłowym.

Kodowanie znaków

Kiedy PHP analizuje dokument XML, wykonuje proces zwany kodowaniem źródłowym w celu odczytania dokumentu. Obsługiwane są trzy formy kodowania:

•  UTF-8
•  ISO-8859-1 (domyślnie)
•  US-ASCII

UTF-8 jest schematem kodowania wielobajtowego, co oznacza, że pojedynczy znak może być reprezentowany przez więcej niż jeden bajt. Pozostałe dwa schematy są jednobajtowe. PHP przechowuje dane wewnętrznie, a następnie wykonuje kodowanie docelowe, gdy przekazuje dane do funkcji. Kodowanie docelowe jest domyślnie ustawione tak samo jak kodowanie źródłowe, ale można to zmienić. Kodowania źródłowego nie można jednak zmienić po utworzeniu obiektu analizującego. Jeśli parser napotka znak, którego kodowanie źródłowe nie może reprezentować, zwróci błąd. Jeśli docelowy schemat kodowania nie może zawierać znaku, znak ten zostanie zdegradowany, aby pasował do schematu kodowania. W praktyce oznacza to, że są one zastępowane znakiem zapytania.

Rozszerzenie XML

Rozszerzenie XML umożliwia tworzenie parserów XML i definiowanie programów obsługi. Powinieneś zapoznać się z następującymi funkcjami.

Funkcja : Zastosowanie

xml:parser_create($encoding) : Tworzy parser XML z podanym kodowanie.
xml:parser_create_ns($encoding, $separator=":") : Tworzy parser XML z podanym kodowanie obsługujące przestrzenie nazw XML.
xml: parser_free ($xmlparser) : Zwalnia parser XML.
xml: set_element_handler ($ xmlparser, $start, $end) : Mówi to parserowi, które funkcje wywołać na początku i na końcu każdego elementu w dokumencie XML. Możesz przekazać FAŁSZ, aby wyłączyć określony moduł obsługi. Zarówno $ start, jak i $ end muszą być wywoływalne i zwykle są to ciągi znaków funkcji, która istnieje w zakresie.

Funkcja, która obsługuje początek elementu, musi zaakceptować trzy parametry:

•  Zasób analizatora składni XML
•  Ciąg znaków, który będzie zawierał nazwę analizowanego elementu
•  Tablica atrybutów tego elementu

Funkcja modułu obsługi końcowej musi zaakceptować dwa parametry:

•  Zasób analizatora składni XML
•  Ciąg znaków, który będzie zawierał nazwę analizowanego elementu

Funkcja xml: set_object ($ xmlparser, $ object) pozwala na użycie parsera XML w obiekcie. Oznacza to, że możesz ustawić metody obiektu jako funkcje do ustawienia obsługi elementu. Funkcja xml: parse_into_struct ($ parser, $ xml, $ valueArr, $ indexArr) analizuje ciąg XML na dwie równoległe struktury tablicowe, jedną (indeks) zawierającą wskaźniki do lokalizacji odpowiednich wartości w tablicy wartości. Te dwa ostatnie parametry muszą zostać przekazane przez odniesienie.

DOM

DOM jest akronimem Document Object Model. Klasa DOMDocument jest przydatna do pracy z XML i HTML. Wykorzystuje kodowanie UTF-8 i wymaga rozszerzenia libxml2 (biblioteka Gnome XML) oraz biblioteki ekspat. Jest to parser drzewa i odczytuje cały dokument do pamięci przed utworzeniem wewnętrznej reprezentacji drzewa.

Oto podstawowy przykład niektórych składni DOMDocument:

< ?php
$domDoc = new DomDocument();
$domDoc->load("library.xml");
// $domDoc->loadXML($xmlString);
// $domDoc->loadHTMLFile("index.html");
// $domDoc->loadHTML($htmlDocumentString);
$domDoc->save(); // (to a file in XML format)
$xmlString = $domDoc->saveXML();
$htmlDocumentString = $domDoc->saveHTML();
$domDoc->saveHTMLFile(); // (to a file in HTML format)
$xpath = new DomXpath($dom);
$elements = $xpath->query("//*[@id]"); // find all elements with an id
echo "I found {$result->length} elements
"; if (!is_null($elements)) {
foreach ($elements as $element) {
echo "
[". $element->nodeName. "]";
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->nodeValue. "\n";
}
}
}

Powinieneś znać następujące metody klasy DOM:

Metoda : Opis

createElement : Tworzy element węzła, który można dołączyć do metody appendChild klasy węzła.
createElementNS : Jak w przypadku createElement, ale obsługuje dokumenty za pomocą przestrzenie nazw.
saveXML : Zrzuca drzewo XML z powrotem do łańcucha.
save : Zrzuca drzewo XML z powrotem do pliku.
createTextNode : Tworzy nowe wystąpienie klasy DOMText.

Węzły DOM

Klasa DOMNode służy do pracy z węzłami w drzewie DOM. Możesz pobrać węzły, wywołując jedną z następujących metod DOMDocument:

•  getElementById
•  getElementsByTagName
• getElementsByTagNameNS

Te metody zwracają obiekt DOMNodeList, który można przeglądać przy użyciuforefore (). Funkcja getElementById () wymaga określenia, który atrybut będzie typu id. Możesz to zrobić albo dołączając definicję DTD, albo wywołując funkcję setIdAttribute (). W obu przypadkach dokument musi zostać zweryfikowany pod kątem funkcji do wywołania. Wstawiając węzeł jako rodzeństwo za pomocą funkcji insertBefore (), należy odwołać się do węzła nadrzędnego, a także określić węzeł rodzeństwa, przed którym chcesz wstawić nowy węzeł. Ten przykład pokazuje składnię:

< ?php
$xmlString = <<< XML
< root >
< teams >
< team >Silverbacks< /team >
< team foo="winner" >Golden Eyes< /team >
< /teams >
< /root >
XML;
$domDoc = new DOMDocument();
$domDoc->loadXML($xmlString);
$xpath = new DomXPath($domDoc);
$team2 = $xpath->query('teams/team[2]');
$parent = $xpath->query('teams');
$textElement = $domDoc->createElement('team', 'Bearhides');
$parent->item(0)->insertBefore($textElement, $team2->item(0));

W tym przykładzie chcemy wstawić nowy zespół między dwoma istniejącymi zespołami. Aby to zrobić, znajdujemy zespół i rodzica.

Uwaga : zmienne te zawierają elementy DOMElements. Nie możemy użyć metody parent (), ponieważ jest ona zdefiniowana w klasie DOMNode.

Powinieneś znać te metody

Metoda : Opis

appendChild : Dodaje nowy węzeł potomny na końcu dzieci.
insertBefore : Dodaje nowy element podrzędny przed węzłem odniesienia.
parentNode : Element nadrzędny węzła lub wartość null, jeśli nie ma elementu nadrzędnego.
cloneNode : Klonuje węzeł i opcjonalnie wszystkie jego potomne węzły.
setAttributeNS : Ustawia atrybut z przestrzenią namespaceURI i nazwą name do podanej wartości. Jeśli atrybut nie istnieje, będzie bądź kreatywny.

Uwaga : Musisz przekazać węzeł jako argument do tych funkcji.

Jeśli próbujesz użyć appendChild(), musisz najpierw użyć funkcji takiej jak DOMDocument :: createElement(), aby utworzyć węzeł.

SimpleXML

SimpleXML to rozszerzenie, które poświęca solidną obsługę złożonych wymagań na rzecz oferowania prostego interfejsu. Wymaga rozszerzenia simpleXML i obsługuje tylko wersję 1.0 specyfikacji XML.

Uwaga : SimpleXML to parser drzewa i podczas analizowania ładuje cały dokument do pamięci. Może to spowodować, że nie będzie on odpowiedni do bardzo dużych dokumentów.

SimpleXML oferuje zorientowane obiektowo podejście do dostępu do danych XML. Wszystkie obiekty, które tworzy, są instancjami klasy SimpleXMLElement. Elementy stają się właściwościami tych obiektów, a atrybuty są dostępne jako tablice asocjacyjne.

Tworzenie obiektów SimpleXML

Możesz tworzyć obiekty SimpleXML metodami proceduralnymi lub poprzez podejście zorientowane obiektowo:

< ? php
// proceduralna ze zmiennej łańcuchowej
$ xml = simple_xml: load_string ($ string_of_xml);
// proceduralne z pliku
$ xml = simple_xml: load_file ('filename.xml');
// obiekt zorientowany na zmienną
$ xml = nowy SimpleXMLElement ($ string_of_xml);

Iterowanie po obiektach SimpleXML

Metoda children () zwraca tablicę obiektów potomnych. Możesz utworzyć algorytm, który sprawdza dzieci węzła, a następnie iteruje je rekurencyjnie. Taki przykład znajduje się na stronie PHP Manual.

Pobieranie informacji

Funkcja : Działanie

SimpleXMLElement :: construct() : Tworzy nowy obiekt SimpleXMLElement.
SimpleXMLElement :: atrybuty () : Identyfikuje atrybuty elementu.
SimpleXMLElement :: getName() : Pobiera nazwę elementu.
SimpleXMLElement :: children() : Zwraca dzieci z danego węzła.
SimpleXMLElement :: count(): Zwraca liczbę dzieci, które ma węzeł.
SimpleXMLElement :: asXML() : Zwraca element jako poprawnie sformatowany string XML
SimpleXMLElement :: xpath() : Uruchamia zapytanie xpath w bieżącym węźle.

xpath

XPath4 to język do definiowania części dokumentu XML. Modeluje dokument XML jako serię węzłów i używa wyrażeń ścieżkowych do nawigacji i wybierania węzłów z dokumentu. SimpleXMLElement :: xpath () uruchamia zapytanie XPath dotyczące danych XML i zwraca tablicę dzieci, które pasują do podanej ścieżki. W3Cschools ma przykłady użycia XPath na swojej stronie internetowej. Należy zauważyć, że w przeciwieństwie do struktur PHP, wyniki XPath nie są zerowane. Nazwa XPath / college / student [1] / zwróci pierwszego ucznia, a nie drugiego, jak w przypadku, gdyby był on zerowany. Tablice PHP zawierające wyniki xpath są zerowane. Innymi słowy, jeśli przechowujesz swoje wyniki w zmiennej tablicowej o nazwie $ tablica, wówczas $ tablica [0] będzie odpowiadać nazwie uczelni / studenta [1] / nazwy z poprzedniego przykładu. Możesz pobrać wartości tekstowe za pomocą wyrażenia XPath takiego: / college / student / name [text ()]. Możesz określić następujące zakresy: / college / student [frekwencja <80] / nazwa.

Wymiana danych między DOM a SimpleXML

Funkcja simple_xml: import_dom () przekształci węzeł DOM w obiekt SimpleXML. Możesz przekonwertować obiekt SimpleXML na DOM za pomocą dom_import_simplexml ().

SOAP

SOAP był pierwotnie akronimem protokołu Simple Object Access Protocol. Wersje 1.0 i 1.1 zostały wydane przez przemysł. Począwszy od wersji 1.2, standard jest kontrolowany przez W3C, a akronim zniknął, dzięki czemu SOAP jest po prostu zwykłą nazwą. Rozszerzenie PHP SOAP służy do pisania serwerów i klientów SOAP. Wymaga włączenia libxml, co ma miejsce w domyślnych instalacjach PHP. Funkcje pamięci podręcznej SOAP są konfigurowane w pliku php.ini za pomocą ustawień soap.wsdl_cache_ *. Jeśli SOAP jest dostępny, udostępnia zestaw predefiniowanych stałych. Stałe te dotyczą wersji SOAP, kodowania, uwierzytelniania, buforowania i trwałości. Istnieją tylko dwie funkcje SOAP:

•  is_soap_fault () zwraca informację, czy wywołanie SOAP nie powiodło się.
•  use_soap_error_handler () jest używany dla serwera SOAP i określa, czy PHP powinno korzystać z procedury obsługi błędów SOAP. Jeśli ma wartość false, zamiast wysyłania błędu SOAP do klienta używana jest obsługa błędów PHP.

Reszta funkcji SOAP jest zapewniona w klasach.

Co robi SOAP

SOAP pozwala definiować i wymieniać złożone typy danych oraz zapewnia mechanizm dla różnych wzorców przesyłania komunikatów, z których najczęstszym jest zdalne wywoływanie procedur (RPC). W efekcie programista może wykonać funkcję na serwerze, przekazać mu złożone dane jako parametry i otrzymać z powrotem złożone dane. Usługi sieciowe SOAP są zdefiniowane przez WSDL (język opisu usługi sieci Web). Większość osób wymawia ten akronim jako "whiz-dill". WSDL definiuje typy danych przy użyciu struktury XML. Opisuje także metody, które można wywoływać zdalnie, podając ich nazwy, parametry i typy zwracanych danych. Wiadomości SOAP między serwerem a klientem są wysyłane w strukturach XML zwanych kopertami SOAP.

Korzystanie z usługi SOAP

Klasa SoapClient służy do łączenia się z usługą SOAP i korzystania z niej. Można przeanalizować plik WSDL, aby dowiedzieć się, jakie metody są dostępne, a następnie przedstawić je w łatwy sposób.

< ?php
$client = nowy SoapClient ("http://example.com/login?wsdl");
$params = array ('username' => 'name', 'password' => 'secret');
// bezpośrednio wywołać metodę logowania
$ client-> login ($ params);
// Jeśli chcesz wywołać __soapCall, musisz zawinąć argumenty w inną tablicę w następujący sposób:

$ client -> __ soapCall ('login', array ($ params));

W poprzednim przykładzie łączymy się z przykładowym WSDL i wywołujemy metodę logowania przy użyciu dwóch różnych metod. Zauważ, że użycie metody SoapClient :: __ soapCall () wymaga zawijania parametrów w tablicy. Dostarczenie WSDL nie jest obowiązkowe dla usługi SOAP. Jeśli chcesz skorzystać z takiej usługi, możesz przekazać wartość NULL jako plik WSDL, ale następnie musisz podać informacje o punkcie końcowym usługi. Musisz podać lokalizację i opcje identyfikatora URI oraz opcjonalnie podać inne informacje o wersji usługi SOAP, jak w tym przykładzie:

< ?php
$client = new SoapClient(null,
['location' => 'http://example.com/soap.php',
'uri' => 'http://test-uri/',
'style' => SOAP_DOCUMENT,
'use' => SOAP_LITERAL));
]);

Podczas konstruowania klasy SoapClient można ustawić parametr śledzenia na wartość true, aby umożliwić debugowanie nieprzetworzonych nagłówków i treści koperty SOAP. Następujące dwa polecenia debugowania wymagają, aby śledzenie było prawdziwe i umożliwiło sprawdzenie szczegółów żądania:

o SoapClient :: __ getLastRequestHeaders()
o SoapClient :: __ getLastRequest()

Oferowanie usługi SOAP

Klasa SoapServer zapewnia serwer SOAP. Obsługuje wersje 1.1 i 1.2 i może być używany z opisem usługi WSDL lub bez niego. Oto przykład konfiguracji serwera SOAP:

< ?php
$options = ['uri' => 'http: // localhost / test'];
$server = nowy SoapServer (NULL, $ options);
$server-> setClass ("MySoapServer");
$server-> handle ();

Widzimy, że najpierw tworzymy serwer z szeregiem opcji. W tym przykładzie nie dostarczamy WSDL w pierwszym parametrze, dlatego musimy podać identyfikator URI przestrzeni nazw serwera w tablicy opcji. Gdy mamy już instancję klasy SoapServer, przekazujemy nazwę klasy, która będzie używana do obsługi żądań. Metody w klasie będą wywoływalne przez klienta SOAP łączącego się z serwerem. Zamiast ustawiać klasę, możesz także użyć konkretnego obiektu do obsługi żądań SOAP, przekazując go jako parametr za pomocą funkcji SoapServer :: setObject ().

Usługi sieci Web REST

REST jest akronimem reprezentatywnego transferu stanu i jest stylem architektonicznym, a nie rozszerzeniem PHP lub zestawem poleceń. REST ma kilka ograniczeń, które mają na celu poprawę wydajności i łatwości konserwacji serwisów internetowych.

Porada : Porównaj "Architektura zorientowana na usługi", która zazwyczaj jest implementowana w SOAP, do "Architektura Microservice", która jest częściej implementowana w REST.

REST ma kilka czasowników, które są podobne do typów żądań HTTP. Prowadzi to do pewnych nieporozumień, ale należy zauważyć, że REST nie musi wykorzystywać HTTP jako warstwy transportowej do komunikacji. HTTP jest po prostu bardzo wygodny dla REST, ponieważ jest bezstanowy, a typy żądań dobrze tłumaczą się na czasowniki REST. REST udostępnia jednolite identyfikatory zasobów (URI), które są połączone z zasobami. Te łącza są nazywane punktami końcowymi REST. W zależności od typu HTTP użytego do uzyskania dostępu, wykonają akcję na zasobie (zmienią jego stan). Typ HTTP służy do sygnalizowania wykonania czasownika REST. REST koncentruje się na zasobach i zapewnianiu dostępu do tych zasobów. Zasób może być czymś w rodzaju "użytkownika". Podobnie jak schemat bazy danych reprezentuje jednostkę użytkownika, REST reprezentuje użytkownika w strukturze JSON lub XML. Reprezentacja powinna być czytelna zarówno dla serwera, jak i klienta. REST może być używany do przesyłania JSON, XML lub obu. Przyjrzymy się temu bardziej szczegółowo później. W PHP jednym z najczęstszych zastosowań interfejsów API REST jest dostarczanie usług dla Interfejs obsługujący AJAX, taki jak napisany w Angular lub ReactJS.

Stany aplikacji i zasobów

Serwer REST nie powinien zapamiętywać stanu aplikacji, a klient powinien przesyłać wszystkie informacje niezbędne do wykonania. Oznacza to, że każde żądanie do serwera jest samodzielne. Jeśli żądanie do serwera nie powiedzie się, nie wpłynie to na powodzenie lub niepowodzenie innych żądań. Poprawia to niezawodność aplikacji. Serwer nie ponosi odpowiedzialności za zapamiętywanie stanu aplikacji i polega na tym, że klient wysyła wszystkie informacje potrzebne do przetworzenia żądania. Oznacza to, że klient przechowuje i utrzymuje stan aplikacji (a nie serwer). Bezpaństwowość aplikacji ma ważne implikacje dla skalowania w poziomie. Ponieważ żaden indywidualny serwer nie utrzymuje stanu, żądanie może dotrzeć do dowolnego serwera w grupie i być obsługiwane poprawnie. Zasób, do którego REST zapewnia dostęp, ma stan, który powinien utrzymywać się między żądaniami. Stan zasobów jest utrzymywany na serwerze.

Czasowniki REST

REST ma kilka czasowników używanych do zmiany stanu zasobu na serwerze. Czasowniki działają albo na jednym zasobie, albo na zbiorze zasobów.

Zbiór:

GET : Zawiera listę identyfikatorów URI, z których można pobrać członków
PUT : Zastąp kolekcję inną kolekcją
POST : Utwórz nowy wpis w kolekcji
DELETE : Usuwa całą kolekcję

Pojedynczy :

GET : Pobierz reprezentację pojedynczego elementu
PUT : Wymień element lub utwórz go, jeśli nie istnieje
POST : Tworzy nowego członka
DELETE : Usuwa członka

PUT i POST wyglądają podobnie, ale mają ważne rozróżnienie. POST wymaga podania wszystkich wymaganych atrybutów elementu i utworzy nowy element. PUT zastąpi atrybuty określone dla istniejącego rekordu i nie musisz podawać wszystkich atrybutów, chyba że tworzysz nowy rekord. Aby wyjaśnić na przykładzie, rozważmy użytkownika, który ma nazwę i tytuł. Najpierw POST, aby utworzyć nowego użytkownika o nazwie "Alice" i tytule "Mrs". Następnie Alice kończy studia i zostaje doktorem, więc NAPISZMY ją do jej rekordu i dołączamy tylko tytuł "Dr". Nie musimy podawać jej imienia, a ponieważ nie, jej imię nie zostanie zmienione.

HATEOAS

HATEOAS oznacza "Hypertext As The Engine Of State". W tej koncepcji odpowiedź serwera będzie zawierać informacje o tym, jakie działania klient może podjąć w następnej kolejności. Opcje te zostaną oznaczone w hipertekstie. Celem jest, aby klient nie wymagał wcześniejszej wiedzy na temat punktów końcowych usługi REST. Zamiast tego otrzymają punkty końcowe, których potrzebują, aby przejść przez aplikację podczas tworzenia zapytania. Rozważmy przykład:

GET /account/12345 HTTP/1.1
HTTP/1.1 200 OK
< ?xml version="1.0"? >
< account >
< account_number>12345
< balance currency="usd">100.00
< link rel="deposit" href="/account/12345/deposit" / >
< link rel="withdraw" href="/account/12345/withdraw" / >
< link rel="transfer" href="/account/12345/transfer" / >
< link rel="close" href="/account/12345/close" / >
< /account >

W poprzednim przykładzie ze strony Wikipedii na stronie HATEOAS pobieramy informacje o koncie bankowym. Serwer odpowiada listą identyfikatorów URI, których można użyć do dalszych działań. Jeśli na przykład konto ma ujemne saldo, serwer może nie zawierać linku do wypłaty pieniędzy. Serwer prowadzi klienta przez interfejs API, ujawniając dodatkowe identyfikatory URI istotne dla ostatniej operacji.

Żądaj nagłówków

HTTP pozwala na przekazywanie nagłówków w swoim żądaniu. Klienci REST użyją ich do wskazania serwerowi, co zapewniają i czego oczekują. Klient REST powinien użyć nagłówka accept, aby wskazać serwerowi, jakiego rodzaju treści (reprezentacji) chce z powrotem. Na przykład, jeśli klient ustawia nagłówek accept na text / xml, informuje serwer, że chce odpowiedzi w formacie XML. Klient ustawi również nagłówek Content-Type, aby poinformować serwer o typie MIME jego ładunku. Aby uzyskać więcej informacji, zobacz sekcję w nagłówku odpowiedzi.

Nagłówki i kody odpowiedzi

Nagłówek Content-Type jest wysyłany przez serwer i określa typ MIME wysyłanego ciała. Na przykład serwer może ustawić typ zawartości na application / json, aby wskazać, że treść odpowiedzi zawiera tekst sformatowany w formacie JSON. Serwer ustawi również kod stanu, który informuje klienta o wyniku żądania. Niektóre z popularnych kodów są wymienione tutaj, ale jest ich znacznie więcej

Kod : Znaczenie

200 : Żądanie przetworzone pomyślnie
201 : Zasób został utworzony
202 : Zasób został przyjęty do przetwarzania, ale nie został jeszcze przetworzony
400 : Złe żądanie (błąd klienta)
401 : niedozwolone; klient musi się uwierzytelnić przed uzyskaniem dostępu do tego zasobu
403 : zabronione; klient sam się uwierzytelnił, ale nie ma na to pozwolenia dostęp do tego zasobu
500 Błąd serwera lub aplikacji

Wskazówka Bardzo słabą praktyką jest wysyłanie wiadomości w treści odpowiedzi, która jest sprzeczna z kodem odpowiedzi HTTP.

W ramach Zend termin "przełączanie kontekstu" odnosi się do zmiany danych wyjściowych programu w zależności od tego, czy odpowiada on na żądanie REST, czy na inne żądanie. Na przykład możesz odpowiedzieć stroną HTML dla normalnych żądań lub JSON, jeśli żądanie pochodzi z XMLHttpRequest (AJAX). Możesz także odpowiedzieć za pomocą XML lub JSON, w zależności od typu zawartości, który klient wskazuje, że chce w odpowiedzi. Innym przykładem może być reakcja przy użyciu różnych układów, w zależności od rodzaju używanej przeglądarki (na przykład urządzenie mobilne czy komputer stacjonarny). Należy zapoznać się z koncepcją serwera, który inaczej reaguje na wywołanie tego samego adresu URL, w zależności od konfiguracji żądania przez klienta.

Wysyłanie wniosków

Rozszerzenie curl jest powszechnym sposobem wysyłania żądań REST w PHP. Curl pozwala określić nagłówki i typy żądań. Istnieją biblioteki, które zawijają funkcje zawijania. Jednym z popularnych jest Guzzle, który jest łatwy w instalacji i obsłudze. Oferuje bardzo szeroki zakres funkcji i, w chwili pisania, jest moim zdaniem najlepszym wyborem klienta żądań dla PHP.

JSON

JSON to akronim JavaScript Object Notation. W PHP jest często używany w Ajaxie, który jest akronimem dla asynchronicznego JavaScript i XML. JSON pozwala na serializację obiektu jako ciąg, aby można go było przenosić między usługami. Ajax jest środkiem do transportu łańcucha. Razem te technologie umożliwiają komunikację między aplikacjami JavaScript w przeglądarce a aplikacjami PHP na serwerze. Rozszerzenie JSON jest domyślnie ładowane do PHP i zapewnia metody obsługi konwersji do i z JSON. Zapewnia szereg stałych, w tym:

Stała : Znaczenie

JSON_ERROR_NONE : Potwierdza, czy wystąpił błąd JSON, czy nie.
JSON_ERROR_SYNTAX : Potwierdza, czy wystąpił błąd składniowy podczas analizowania JSON i pomaga wykryć błędy kodowania.
JSON_FORCE_OBJECT : Jeśli zakodowana jest pusta tablica PHP, ta opcja zmusi ją do tego zakodowany jako obiekt.

Rozszerzenie oferuje trzy funkcje. json_decode() pobiera ciąg znaków jako pierwszy argument i zwraca obiekt. Jeśli drugi parametr ma wartość true, zwróci tablicę asocjacyjną. Począwszy od PHP 5.3, dostarczane są dwie dodatkowe opcje - $ deep i $ options. Głębokość odnosi się do głębokości rekurencji i obecnie jedyną opcją jest JSON_BIGINT_AS_ STRING, która zmienia rzutowanie dużych liczb całkowitych jako liczb zmiennoprzecinkowych, które mają być rzutowane jako ciągi znaków. Jeśli głębokość rekurencji zostanie przekroczona, json_decode () zwróci NULL, a json_last_ error_msg () zwróci "Przekroczono maksymalną głębokość stosu". Stanie się tak, jeśli tablica ma więcej poziomów niż głębokość, którą określiłeś jako akceptowalną. Jako przykład rozważmy ten kod:

$ arr = [
"owoce" ⇒ [
"jabłko" ⇒ ["smak" => "słodki", "kolor" => "żółty"],
"banan" ⇒ ["smak" => "kwaśny", "kolor" => "zielony"],
"wiśnia" ⇒ ["smak" => "słodki", "kolor" => "czerwony"]
],
"warzywa" ⇒ "fuj"
];
$ str = json_encode ($ arr);
$ decode = json_decode ($ str, true, 1);
echo json_last_error_msg (); // Przekroczono maksymalną głębokość stosu

Tablica ma dwa poziomy, ponieważ każdy owoc zawiera tablicę. Określamy, że chcemy zdekodować tylko jeden poziom głębokości, więc $decode będzie NULL, a skrypt wyświetli komunikat "Przekroczono maksymalną głębokość stosu". json_encode() przyjmuje jako parametr zmienną dowolnego typu (inną niż zasób) i zwraca reprezentację JSON. Ma dwa opcjonalne parametry - $ głębokość i $ opcje - które są takie same jak opisano wcześniej. json_last_error() zwraca ostatni kod błędu, który wystąpił w jednej z poprzednich funkcji, a json_last_error_msg() zwraca komunikat tekstowy.

Wskazówka : Pamiętasz z poprzedniej części że JSON jest preferowanym sposobem szeregowania danych przesyłanych do klienta.

Data i godzina

PHP udostępnia kilka funkcji, które pobierają datę i godzinę z serwera. Powinieneś ustawić domyślną strefę czasową w swojej konfiguracji lub ustawić ją w środowisku wykonawczym w swoim skrypcie. Powinieneś ustawić strefę czasową, aby pasowała do strefy czasowej, w której znajduje się twój serwer, aby PHP mógł poprawnie zinterpretować czas serwera. Pozwala to również Twojemu skryptowi zwracać uwagę na zmiany, takie jak czas letni. PHP 5.2 wprowadziło klasę DateTime, która zajmuje się szerokim zakresem obliczeń daty i godziny. Zaleca się korzystanie z tej klasy zamiast pracy z funkcjami takimi jak date () i time (). Aby utworzyć nowy obiekt DateTime, przekazujesz mu ciąg, który może przeanalizować. Rozumie szeroki zakres formatów ciągów, takich jak pokazano w tym przykładzie:

< ?php
$strings = [
'Next monday',
'Yesterday',
'', // now
'2016-12-25',
'25 December 2016',
'-1 week',
'+1 days'
];
foreach ($strings as $example) {
$dateTime = new DateTime($example);
echo $dateTime->format(DateTime::COOKIE) . PHP_EOL;
}

Wszystkie ciągi w tablicy z tego przykładu zostaną zrozumiane. Jeśli format daty jest niejednoznaczny, możesz użyć komendy DateTime :: createFromFormat (), aby utworzyć obiekt. Na przykład data 3 czerwca 2013 r. Zostanie zapisana przez Amerykanina jako 06-03-2013, a reszta świata jako 03-06-2013. Jeśli podasz którykolwiek z tych ciągów do PHP, nie będzie wiedział, czy masz na myśli 3 czerwca 2013 czy 6 marca 2013. Aby rozwiązać niejednoznaczność, możesz określić, jakiego formatu używasz w swoim ciągu, na przykład:

$ dateTime = DateTime :: createFromFormat ('d-m-Y', '06 -03-2013 ');
echo $ dateTime-> format (DateTime :: COOKIE);

Skrypt wyświetli coś takiego jak środa, 06-mar-2013 12:56:42 CET.

Zauważ, że jeśli pominiesz czas podczas tworzenia klasy DateTime, zostanie użyty czas, w którym skrypt jest uruchomiony.

Formatowanie dat

W tych przykładach użyliśmy jednej ze stałych klas podanych przez DateTime do sformatowania naszej daty. Podręcznik zawiera listę tych stałych, które są częstymi przypadkami użycia do wyświetlania lub przechowywania daty. Pojawiają się w tej tabeli:

Stała : Format

ATOM : Y-m-dTH: i: sP
COOKIE : 1, d-M-Y H: i: s T
ISO8601 : Y-m-dTH: i: sO
RFC822 : D, d M y H: i: s O
RFC850 : l, d-M-y H: i: s T.
RFC1036 : D, d M y H: i: s O
RFC1123 : D, d M Y H: i: s O
RFC2822 : D, d M Y H: i: s O
RFC3339 : Y-m-dTH: i: sP
RSS : D, d M Y H: i: s O
W3C : Y-m-dTH: i: sP

Są to stałe ciągowe i zawierają kody formatujące datę i godzinę. Kody formatujące są zastępowane wartością przez klasę DateTime. Na przykład symbol "Y" zastępuje się czterocyfrowym rokiem przechowywania daty. Oczywiście, celem deklaracji stałej jest to, że nie musisz zapamiętywać ciągów, więc nie martw się o studiowanie formatów. Dołączyłem ciągi formatujące, ponieważ są one dobrym wskazaniem najczęściej używanych. Kody formatowania daty i godziny uwzględniają wielkość liter. Na przykład "y" to dwucyfrowy rok, a "Y" to czterocyfrowy rok. Znaki w ciągu formatującym, które nie są rozpoznawane jako znaki formatujące, zostaną umieszczone na wydruku bez zmian. Zatem ciąg "Y-m-d" będzie zawierał łączniki między rokiem, miesiącem i dniem, w którym dane wyjściowe - tak jak ten "2015-12-25". Możesz znaleźć listę kodów formatujących datę i czas PHP na stronie podręcznika, ale oto te, które są w poprzedniej tabeli:

Kod : Zastąpiony przez : Przykłady

Y : Pełny czterocyfrowy rok : 1999
M : Dwucyfrowy miesiąc z wiodącymi zerami : 06
d : Dzień miesiąca, dwie cyfry z wiodącymi zerami : 14
D : Trzyliterowy dzień tekstowy : Mon, Tue, Wed
H : Format 24-godzinny z wiodącym zerem : 00, 09, 12, 23
i : Dwucyfrowa minuta, z wiodącymi zerami : 05,15,25,45
s : Dwucyfrowe sekundy, z wiodącymi zerami : 05,15,25,45
P : Różnica względem czasu Greenwich (GMT) z dwukropkiem między godzinami a minutami (PHP 5.1.3+) : +02: 00
O : Różnica względem czasu Greenwich (GMT) w godzinach : +0200
T : Skrót strefy czasowej : EST, CET

Obliczenia daty

Najprostsze obliczenia można wykonać za pomocą metody klasy DateTime modyfikuj (). Na przykład, aby znaleźć datę i godzinę przypadającą na miesiąc w przyszłości, możesz wykonać następujące czynności:

< ? php
$dateTime = new DateTime ();
$dateTime-> modyfikuj ("+ 1 miesiąc");
echo $dateTime-> format (DateTime :: COOKIE). PHP_EOL;

Jednak PHP oferuje znacznie bardziej elastyczny sposób pracy z obliczeniami dat. Klasa DateInterval służy do przechowywania określonego czasu (w latach, miesiącach, dniach, godzinach itp.) Lub względnego ciągu czasu w formacie obsługiwanym przez konstruktor DateTime. Klasa DateTime pozwala add() lub sub() DateInterval z DateTime. W ten sposób poradzi sobie z latami przestępnymi i innymi korektami czasu. Aby określić stałą ilość czasu podczas tworzenia obiektu DateInterval, przekazujemy jego konstruktorowi ciąg znaków. Ciąg zawsze zaczyna się od P, a następnie wyświetla numer każdej jednostki daty w porządku malejącym. Opcjonalnie pojawia się litera T, a następnie uwzględniane są jednostki czasu. Ma to o wiele większy sens w przypadku niektórych przykładów:

Ciąg znaków : Opis

P14D : 14 dni
P2W : Dwa tygodnie
P2W5D : To jest nieprawidłowe; nie możesz podawać tygodni i dni razem w jednym ciągu znaków; tygodnie zostaną zignorowane
P2WT5H : Dwa tygodnie i pięć godzin
P1Y2M3DT4H5M : Jeden rok, dwa miesiące, trzy dni, cztery godziny, pięć minut

Uwaga:

•  Każdy ciąg zaczyna się od P
•  Liczba jednostek poprzedza literę oznaczającą jednostkę
•  Jednostki czasu są dzielone od jednostek daty literą T
•  Jednostki są sortowane w kolejności malejącej

Oto przykład w kodzie:

< ?php
$dateTime = DateTime::createFromFormat('d-m-Y H:i:s', '01-12-2016 13:14:15');
$dateInterval = new DateInterval('P1M2DT3H4M5S');
$dateTime->add($dateInterval);
echo $dateTime->format(DateTime::COOKIE) . PHP_EOL;

Ten kod wyświetla datę i godzinę, która wynosi jeden miesiąc, dwa dni, trzy godziny, cztery minuty i pięć sekund po 1 grudnia 13:14:15.

Ręczne obliczenia daty

Czasami będziesz musiał pracować ze znacznikiem czasu w stylu UNIX. Ten znacznik czasu jest liczbą, która zawiera liczbę sekund, które upłynęły od epoki UNIX, 1 stycznia 1970 r. Jedną z zalet znacznika czasu jest to, że jest niezależny od stref czasowych. Istnieje kilka funkcji PHP, które pozwalają utworzyć znacznik czasu. Funkcja strtotime() to bardzo elastyczny sposób na konwersję opisu daty i godziny na znacznik czasu. Jest wystarczająco inteligentny, aby rozpoznać frazy takie jak "następny poniedziałek" lub "+1 rok", a także bardziej przyziemne ciągi, takie jak "1 kwietnia 2017 r.". Funkcja mktime() akceptuje parametr dla każdej godziny, minuty, sekundy, miesiąca, dnia lub roku. mktime() zwraca znacznik czasu UNIX podanych argumentów. Jeśli argumenty są niepoprawne, funkcja zwraca FAŁSZ. Zauważ, że kolejność parametrów nie zwiększa wielkości jednostki, ale jest w kolejności "h i s m d y". Możesz pominąć parametry od prawej do lewej, w którym to przypadku domyślnie przyjmują bieżącą wartość daty. Więc jeśli bieżącym rokiem jest 2016 i wywołasz mktime() bez określenia roku, PHP przyjmie, że masz na myśli 2016. Jeśli przekażesz parametr mktime(), który jest większy niż wartość, która powinna być dozwolona, mktime() zakłada, że masz na myśli, że odnosisz się do następnego okresu. Na przykład w grudniu jest 31 dni. Jeśli zadzwonisz na mktime (0, 0, 0, 12, 32, 2016), otrzymasz znacznik czasu dla pierwszego dnia następnego miesiąca; innymi słowy, na 1 stycznia 2017 r.

Porównywanie dat

Metoda DateTime :: diff () pozwala porównać różnicę między dwoma obiektami DateTime. Zwraca DateInterval, który zawiera przedział czasu między dwiema reprezentowanymi datami. Należy pamiętać, że klasa DateTime obsługuje strefę czasową i czas letni i robi konwersje dla ciebie. Spróbujmy dowiedzieć się, ile czasu minęło do świąt Bożego Narodzenia.

< ?php
$now = new DateTime();

$christmas = new DateTime('25 december');
if ($now > $christmas) {
$christmas = new DateTime('25 december next year');
}
$interval = $christmas->diff($now);
// 97 days until Christmas
echo $interval->days . ' days until Christmas' . PHP_EOL;

W tym fragmencie zwróć uwagę na następujące kwestie:

•  Nie przekazanie żadnego parametru do konstrukcji powoduje użycie bieżącej daty i godziny.
•  Możemy użyć operatorów matematycznych, takich jak>, < i ==, aby porównać obiekty DateTime.
•  Możemy używać dość elastycznego języka podczas tworzenia DateTime, np. "25 grudnia przyszłego roku" w przypadku, gdy bieżąca data przypada między Bożym Narodzeniem a Nowym Rokiem.
•  Metoda diff() zwraca wartość DateInterval.
•  Obiekt DateInterval ma wiele właściwości publicznych, które można uzyskać dostęp do pomiaru lat, miesięcy, a w tym przypadku dni.

Struktury danych PHP SPL

Standardowa biblioteka PHP (SPL) to zbiór interfejsów i klas, które mają rozwiązywać typowe problemy. Zawiera kilka klas, które pomagają w pracy ze standardowymi strukturami danych.

Interfejsy związane ze strukturami danych

Zanim przyjrzymy się klasom struktury danych SPL, warto przyjrzeć się niektórym interfejsom, które implementują. Dzięki temu znacznie łatwiej jest zapamiętać funkcje klas.

Iterator

Interfejs Iterator rozszerza interfejs Traversable. Interfejs Iterator11 definiuje pięć metod poruszania się po kolekcji.

Metoda : Cel

current : Zwraca bieżący element
key : Zwraca klucz bieżącego elementu
next : Przejście do następnego elementu
rewind : Przewija iterator do pierwszego elementu
valid : Sprawdza, czy aktualna pozycja jest poprawna

Traversable

Klasa implementująca interfejs traversable może być zapętlona za pomocą foreach(). Interfejs ten nie może być zaimplementowany sam, można go zaimplementować tylko poprzez implementację interfejsu, który mówi klasie, jak iterować po kolekcji. W praktyce oznacza to, że aby wdrożyć interfejs przechodzący, należy wdrożyć interfejs Iterator lub IteratorAggregate.

ArrayAccess

Ten interfejs zapewnia dostęp do obiektów jako tablic. Aby to zrobić, musisz zaimplementować cztery metody:

Metoda : Cel

offsetExists : Czy istnieje offset
offsetGet : Przesunięcie do pobrania
offsetSet : Przypisz wartość do określonego przesunięcia
offsetUnset : Odznacz przesunięcie

Jeśli twoja klasa implementuje ten interfejs, będziesz mógł użyć składni tablic podczas odwoływania się do obiektu z niego utworzonego.

Counable

Jeśli twoja klasa implementuje interfejs Countable, będziesz mógł użyć funkcji count(), aby znaleźć ile ma elementów. Interfejs Countable ma abstrakcyjną metodę o nazwie count. Ta metoda zostanie wywołana, gdy wywołasz funkcję PHP count () dla obiektu utworzonego z klasy implementującej interfejs.

< ?php
class BadCount implements Countable
{
public function count()
{
return 42;
}
}
$a = new BadCount;
echo count($a); // 42

W trywialnym przykładzie metoda count () w tej klasie zawsze zwraca liczbę 42. W bardziej skomplikowanym przykładzie możemy zaimplementować tutaj logikę, która określa, w jaki sposób chcesz zwrócić liczbę obiektów.

Listy

Lista to uporządkowana kolekcja elementów. Ta sama wartość może pojawić się więcej niż raz na liście. Podwójnie połączona lista to lista, w której każdy element zawiera link do poprzedniego i następnego elementu w łańcuchu. Klasa SplDoublyLinkedList implementuje interfejsy Iterator, ArrayAccess i Countable. Ponadto implementuje metody, które pozwalają zmieniać zachowanie iteratora, a także dodawać lub usuwać elementy z przodu lub z tyłu listy. Klasa SplStack rozszerza klasę SplDoublyLinkedList. Zasadniczo jest to SplDoublyLinkedList, w którym wywołano setIteratorMode() i ustawiono iterację listy za pomocą IT_MODE_LIFO i zachowanie w trybie IT_MODE_KEEP. To mówi iteratorowi, aby przechodził przez listę jak stos (ostatnie wejście, pierwsze wyjście) i przejście elementów zamiast ich usuwania. Klasa SplQueue16 rozszerza również klasę SplDoublyLinkedList. Implementuje metody kolejkowania i usuwania z kolejki, które dodadzą odpowiednio element na końcu kolejki lub usuną ten z przodu kolejki.

Uwaga : Zarówno klasy SplStack, jak i SplQueue dziedziczą po klasie SplDoublyLinkedList, dzięki czemu można przez pomyłkę wywołać na nich niewłaściwe metody.

Oto przykład użycia stosu, który pokazuje niektóre metody, których możesz użyć. Ta tabela pokazuje wartości zawarte w stosie.

Kod : Zawartość Stosu

< ?php
$stack = new SplStack(); : Null
$stack->push(5); : 5
// używa to składni tablicowej, aby dodać nowy element
$stack[] = 4; : 5, 4
// teraz wypychamy kolejny numer do końca
queue
$stack->push(3); : 5, 4, 3
// wstawia liczbę 100 do pozycji 1
// elementy poniżej są tasowane
$stack->add(1, 100); : 5, 100, 4, 3
// zwraca ostatnią wartość w kolejce
echo "Pop: " . $stack->pop() . PHP_EOL; : 0, 100, 4
foreach ($stack as $key => $value) {
echo "$key => $value" . PHP_EOL;
}

Dane wyjściowe tego kodu są następujące:

Pop: 3
2 &rArrr; 4
1 &rArrr; 100
0 &rArrr; 5

Uwaga : Klucze znajdują się na stosie w kolejności malejącej (2,1,0).

Sterty

Sterty to struktury drzewiaste, w których węzły nadrzędne mogą mieć zero, jeden lub więcej węzłów podrzędnych. Sterty definiują regułę porównania, która pozwala ustalić, czy jeden węzeł jest większy, czy mniejszy niż inny węzeł. Na stercie węzeł nadrzędny zawsze będzie równy lub większy niż jego elementy potomne. Funkcja porównania służy do ustalenia, czy węzeł jest większy czy mniejszy od innego.

Uwaga : Klasa SplHeap jest klasą abstrakcyjną. Kiedy jej używasz, musisz zaimplementować funkcję porównywania.

Klasa SplHeap implementuje interfejs Iterator, co oznacza, że możesz używać foreach () do poruszania się po nim. Klasa SplMaxHeap rozciąga się od SplHeap i utrzymuje maksymalną wartość na górze. Robi to, implementując dla Ciebie funkcję Compare (). Podobnie klasa SplMinHeap utrzymuje minimalną wartość na górze.

Uwaga : SplMinHeap i SplMaxHeap to tylko klasy, które rozszerzają SplHeap i implementują funkcję Compare () w celu zapewnienia sortowania kierunkowego.

Spójrzmy na przykład prostej sterty:

< ?php
class MyHeap extends SplHeap
{
function compare($a, $b)
{
return $a ⇔ $b;
}
}
$heapExample = new MyHeap;
$heapExample->insert(10);
$heapExample->insert(5);
$heapExample->insert(15);
while ($heapExample->valid()) {
echo $heapExample->current() . PHP_EOL;
$heapExample->next();
}

Ten kod wyprowadza liczby w posortowanej kolejności malejącej, ponieważ gdy je wstawimy, zastosuje funkcję Compare (), aby ustalić, gdzie je umieścić.

Uwaga: Jeśli mielibyśmy zmienić kod i rozszerzyć SplMinHeap lub SplMaxHeap zamiast SplHeap, wynik jest taki sam jak w poprzednim kodzie!

Słyszę, jak mówisz z irytacją, że SplMinHeap ma utrzymywać najniższą wartość na górze, więc dlaczego wynik pokazuje, że 15 wciąż jest na górze? Odpowiedź brzmi, ponieważ wszystko, co zapewniają klasy SplMinHeap i SplMaxHeap, jest domyślną implementacją funkcji Compare(), którą zastępujemy w definicji klasy. Możesz przedłużyć SplMinHeap, ale dopóki twoja funkcja Compare() pozostanie taka sama, jak w poprzednim przykładzie, zawsze będziesz mieć maksymalną stertę. Aby uzyskać działającą implementację stosu min (w naszym przykładzie), musisz albo zamienić operandy dla operatora statku kosmicznego, albo całkowicie unikać implementacji funkcji Compare() i użyć deklarowanej w SplMinHeap.

Tablice

Struktura SplFixedArray przechowuje dane w sposób ciągły, dostępny przez indeksy. Jest szybszy niż normalne tablice PHP, ale jest również mniej elastyczny, ponieważ ma stałą długość i może używać tylko liczb całkowitych jako indeksów. Klasa SplFixedArray implementuje interfejs Iterator i interfejs ArrayAccess.

Mapy

Mapa to struktura zawierająca pary klucz-wartość. Tablica PHP jest rodzajem mapy, ponieważ przechowuje wartości w stosunku do kluczy całkowitych (lub łańcuchowych). SplObjectStorage zapewnia mapę od obiektów do danych, a jeśli zignorujesz dane, może działać jako zestaw obiektów. SplObjectStorage nie jest klasą abstrakcyjną i może być tworzona bezpośrednio. Implementuje interfejsy Countable, Iterator, Serializable i ArrayAccess. Ponieważ implementuje interfejs ArrayAccess, możesz użyć składni tablic aby odwołać się do danych obiektów wewnątrz struktury, takich jak te:

< ?php
$bucket = new SplObjectStorage();
$file = new StdClass;
$metaData = ['name' ⇒ 'passwords.xslx', 'size' &rARr; '102400'];
$bucket[$file] = $metaData;
W tym przykładzie mapujemy dane (metadane) na określoną instancję obiektu (pliku).

Podsumowanie struktur danych SPL

SplHeap : Sterta to kolekcja drzew, w której dzieci rodzica muszą zawsze mieć wartość niższą niż ich rodzic. Istnieją różne rodzaje sterty.
SplMaxHeap : Jest to rodzaj sterty, w której maksimum jest utrzymywane na górze sterty.
SplMinHeap : W tego typu stosie minimum jest utrzymywane na górze
SplPriorityQueue : Jest to kolejka, w której każdy element ma również "priorytet" powiązany z tym. Przykładem przypadku użycia jest przepustowość zarządzania, w którym ruch określonego typu ma wyższy priorytet przed innym ruchem.
SplFixedArray : Jest to szybsza implementacja tablicy, ale ogranicza Cię do tablicy o stałej długości, która zawiera tylko liczby całkowite.
SplObjectStorage : Ta klasa zapewnia wygodny sposób mapowania obiektów i ich danych.


QUIZ



P1. Znaki, których nie można zakodować w docelowym schemacie kodowania XML, generują błąd.

-------------------------
Prawda
Fałsz; generują ostrzeżenie
Fałsz; są dopasowane do schematu kodowania (konwertowane na znaki zapytania)
Żadne z powyższych

P2: Prawda czy fałsz? Serwer nie może wysłać odpowiedzi REST z kodem stanu HTTP 200, jeśli żądanie nie powiedzie się.

-------------------------
Prawda
Fałsz

P3: Co wygeneruje ten kod?

< ?php
$arr = [
"fruits" ⇒ [
"apple" ⇒ ["taste" ⇒ "sweet", "color" ⇒ "yellow"],
"banana" ⇒ ["taste" ⇒ "sour", "color" ⇒ "green"],
"cherry" ⇒ ["taste" ⇒ "sweet", "color" ⇒ "red"]
],
"vegetables" => "yuck"
];
$str = json_encode($arr);
$decode = json_decode($str, true, 1);
echo json_last_error_msg();

-------------------------
Błąd składni; nie będzie działać
Nic; nie ma komunikatu błędu, więc instrukcja echo nic nie wyświetla
Przekroczono maksymalną głębokość stosu
Błąd krytyczny, drugim parametrem do pliku json_decode nie może być "prawda"

P4: Powinieneś ustawić domyślną strefę czasową dla swojej aplikacji PHP. Które z poniższych metod możesz tego użyć? Wybierz tyle, ile dotyczy.

-------------------------
Korzystanie z funkcji set_date_default_timezone ()
Edycja php.ini
Użycie komendy time () Linux w PHP
Korzystając z funkcji ini_set () PHP, wykonaj następujące czynności:
ini_set ("date.timezone", "Europe / Edinburgh");

P5: Co wygeneruje ten kod?

< ? php
$stos = nowy SplStack ();
$stack-> push (5);
$stos [1] = 4;
echo $stack-> pop ();

-------------------------
4
5
Wystąpi błąd krytyczny

P6: Co jest nie tak z następującym kodem PHP?

< ?php
$client = new SoapClient("http://example.com/login?wsdl");
$params = array('username'=>'name', 'password'=>'secret');
// bezpośrednio wywołać metodę logowania
$client->login($params);

-------------------------
Błąd składni; w ogóle nie będzie działać
Parametry metody logowania należy przekazać w następujący sposób: $ client- > login ([$ params]);
Nie można wywołać metody bezpośrednio w SoapClient
Wszystko w porządku; to zadziała

P7: Co wygeneruje ten kod?

< ?php
$xmlString = << < root >
< teams >
< team >Silverbacks< /team >
< team>Golden Eyes< /team >
< /teams >
< /root >
XML;
$xml = new SimpleXMLElement($xmlString);
$result = $xml->xpath('teams/team[1]');
echo $result[0];

-------------------------
Błąd składni; nie uruchomi się
Srebrne grzbiety
Złote oczy
Wygeneruje ostrzeżenie, ponieważ xpath nie będzie mógł ocenić

P8: Możesz przekonwertować obiekt SimpleXML do DOM za pomocą funkcji ______.

-------------------------
dom_import_simplexml()
simple_xml: import_dom()
simple_xml: export_dom()
Żadne z powyższych

P9: Jaka jest wydajność tego skryptu?

< ?php
$xmlString = << < root >
< teams >
< team >Silverbacks< /team >
< team foo="winner">Golden Eyes< /team >
< /teams >
< /root >
XML;
$domDoc = new DOMDocument();
$domDoc->loadXML($xmlString);
$textElement = $domDoc->createElement('team', 'Bearhides');
$result = $domDoc->xpath('teams/team[2]');
$result[1]->insertBefore($textElement);
echo $domDoc->saveXML();

-------------------------
Spowoduje to błąd krytyczny
Dokument XML z nowym zespołem na początku listy zespołów
Dokument XML z nowym zespołem między dwoma zespołami
Żadne z powyższych

P10: Co wygeneruje następujący kod?

< ?php
$dateTime = new DateTime();
$interval = new DateInterval('P1Y2M3D4H5M');
$dateTime->add($interval);
echo $dateTime->format(DateTime::COOKIE);

-------------------------
Spowoduje to błąd krytyczny
Data: rok, dwa miesiące, trzy dni, cztery godziny i pięć minut w przyszłości
Żadne z powyższych

ODPOWIEDZI



•  Fałsz

• Fałsz

•  Przekroczono maksymalną głębokość stosu

•  Edycja php.ini

•  Wystąpi błąd krytyczny

•  Wszystko w porządku; to zadziała

• Silverbacks

• dom_import_simplexml()

•  Spowoduje to błąd krytyczny

•  Spowoduje to błąd krytyczny