Szukaj na tym blogu

Postaram się przekazać swoje doświadczenia z PHP, oraz innych dziwnych rzeczach, typu MySQL, DB2. Czyli to co umiem. Blogoczytelników o słabych nerwach proszę o nieczytanie tego blogu. Dlaczego? Jeszcze nie wiem. W razie pytań z dziedziny PHP proszę pytać, jest cień możliwości że akurat to wiem. ;)

sobota, 13 sierpnia 2011

Programowanie obiektowe w PHP.

Złośliwi opowiadają że Java jest obiektowa, Obcjective-C jak w samej nazwie jest obiektowy. Tylko jakiś ten PHP nie ma obiektów jest prostacki i dla amatorów. Dopiero jak przesiądziesz się na Java lub te drugie, to dopiero czujesz że pracujesz obiektowo. Ja na to odpowiadam że to stek bzdur. Co do Objective-C nie mogę nic napisać, bo nie programuję (jak będę chciał wywalać 100$ Applowi za konto deweloperskie co rok, wtedy będę pyskował), za to Javie mogę wytknąć kilka bzdurnych i przyprawiających o zawał obiektów, dzięki którym nasz króciutki programik działa z „zawrotną prędkością”, jak by procesor był taktowany zegarem z kukułką która właśnie zdechła. Już nie wspominam że owa obiektowość może wygenerować błąd składający się z 50 linii, z czego każda linia dotyczy czego innego, coś do poćwiczenia prekognicji (jasnowidzenia). Zdarzyło się kilka razy iż błąd nie miał nic wspólnego rzeczywistością.

Dość tego jadu, teraz pokaże jak obiektowo można pracować w PHP. Pierwszym jaki rzuca się w oczy i jest oczywisty jest podłączenie się do bazy danych.


<?php
$mysqli = new mysqli("localhost", "juzer", "pasłord", "baza");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

if (!$mysqli->query("SET zmienna=1")) {
printf("Errorcode: %d\n", $mysqli->errno);
}

$mysqli->close();
?>


Jak zwykle większość kodów to jest obsługa błędów. Złośliwi mówią że 90% kodu to obsługa błędów i kod idioto odporny co by użytkownik bzdur nie wpisywał. W sumie coś w tym jest.
Nie będę się pastwił nad MySQL'em, tam można pomęczyć się ze statemantami i takimi tam dziwactwami, ale ja po pastwię się nad DOMDocument. Nawet uzasadnię zaraz dlaczego.

Otóż jest kilka filozofii pisania stron. Pierwsza prostacka tworzenie HTML/XHTML od początku. Na początku <html> potem <head>. W <head> mamy różne metatagi takie jak kodowanie strony, kto to popełnił, mamy również gdzie są CSS, tytuł parę JS do AJAX'a Google Analitics oraz inne dziwolągi. Potem mamy <body>. W body mamy tabelki, <div>, <strong>, <b> i inne dziwne rzeczy. Trzeba pamiętać żeby to wszystko pozamykać w odpowiedniej kolejności i tak dalej. Programowanie tego przypomina programowanie liniowe i jak okaże się że z jakiegoś powodu tytuł strony wynika nam z zawartości strony i nie możemy go ustalić w head, zostaje nam strzelić se w łeb.
Druga metoda to template. W nich umieszczone są różnego rodzaju zmienne, np. $tytuł i tam się objawi tytuł jak puścimy przez jakiś kombajn zwany CRM'em, albo PEAR'em. Można oczywiście robić pętelki typu coś się powtarza, ale moim skromnym zdaniem jakoś mi to nie podchodziło od samego początku.

Moja zwariowana metoda (najwyżej ktoś mnie odwiezie do Tworek, wreszcie odpocznę) jest to wpakowanie do DOM. Co prawda opiera się na template, ale po co tworzyć całą stronę w DOOM. Kod będzie długi, a żaden grafik tego nie zrobi. Niech DOM martwi się o zamykanie wszystkich tagów i poprawności zawartości i innymi zgodnościami RSS których normalny człowiek nie jest w stanie ogarnąć. Choćby w linkach powinny zmienne GET dzielone &apm; a nie jak większość robi samym &.
Oto króciutki przykład o co mnie chodzi, dalej będę pastwił się w części drugiej. Mamy prosty HTML.


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<h1>To jest strona z tytułem</h1>
Jak widać tytuł jest, a w templacie nie.
</body>
</html>


Jak widać <title> jest puste. To straszne! Trzeba coś z tym zrobić! Spokojnie, o to prościutki skrypt pozujący idee mojego mądrzenia się na łamach bloga.


<?php
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->validateOnParse = TRUE;


To coś tworzy dokument DOM. ValidateOnParse jest na true co by ładnie był HTML poukładany i nie walił wszystkiego w jednej linii.
Teraz trzeba załadować nasz wspaniały przykład HTML ku uciesze gawiedzi. Robi się to tak:


$dom->loadHTMLFile($plik);


Prawda że skomplikowane? Teraz trzeba wyłapać <title> i wrzucić tam nasz wspaniały tytuł. Oczywiście najprościej było by w title umieścić id i już, ale to nie przystoi prawdziwemu wojownikowi, więc zrobimy to tak:


$title = $dom->getElementsByTagName('title')->item(0);
$title->nodeValue = 'Oto wspaniały tytuł, który każdemu się spodoba.”


To wszystko. Zaletą tego rozwiązania jest że tytuł można dodać, zmienić, dopisać w każdej chwili. Nie trzeba się martwić jak w pierwszym przykładzie innych rozwiązań, kiedy to się programuje a'la liniowyo, że na początku tytuł, a potem reszta strony. Teraz można zrobić jak kto chce.

Teraz najważniejszy fragment zabawy, mianowicie wyświetlenie zawartości DOM jako HTML:


echo $dom->saveHTML();


To wszystko. W dalszych częściach mojego mądrzenia się pokaże jak można robić inne rzeczy za pomocą tej biblioteki. Chciałem tylko ostrzec, ona jest dość mocno uzależniająca. ;)

Także pomyśl jak potworzysz sobie z tego klasy własnej produkcji i pomysłu jakie będziesz miał ułatwione życie. Inne CRM pognasz precz i nie będziesz chciał o nich słyszeć.

Na koniec zdradzę moje motto. Im mniej używasz gotowców, tym mniej masz włamań na stronę. Lepiej napisać coś samemu, na to nie ma gotowych pakietów do włamań przez serwisy w internecie.

Brak komentarzy:

Prześlij komentarz

Konstruktywne komentarze mile widziane.
Wulgaryzmy, obraźliwe stwierdzenia będą usuwane.