Apple Facebook Google Microsoft badania bezpieczeństwo patronat DI prawa autorskie serwisy społecznościowe smartfony

Istnieje wiele paradygmatów programowania. Mamy programowanie strukturalne, obiektowe, logiczne, deklaratywne itp. Każde z tych podejść ma swoje wady i zalety. Każde z nich ma swoje zastosowania. Jednak programowanie obiektowe zyskuje w obecnych czasach największą popularność. Tekst ten ma na celu wprowadzenie osób początkujących w programowanie obiektowe, dając im solidne podstawy do dalszego rozwoju w tym kierunku. Tekst przeznaczony jest dla osób, które mają już doświadczenie w programowaniu strukturalnym.

1. Kim jesteś? Czego chcesz?

Najpierw należy sobie zadać pytanie: Dlaczego programowanie obiektowe tak bardzo zyskuje na popularności? Odpowiedź jest dość prosta. Prawdopodobnie najbardziej odpowiada temu, jak postrzegamy nasz świat. Nazwa tego paradygmatu mówi o obiektach. W otaczającym nas świecie znajdziemy wiele obiektów. Dla przykładu monitor. Ten psujący oczy kawał elektroniki to taki sam obiekt, jak kamień, drzewo, książka czy ziemniak. Cechuje go kilka właściwości. Jest to rozdzielczość i przekątna ekranu, odświeżanie, kolor, zużycie prądu, marka, waga itp. Możemy też go używać do różnych rzeczy. Jesteśmy w stanie go włączyć, wyłączyć, rzucić o ścianę, a zepsuty nadal nadaje się świetnie na przycisk do papieru.

Nie inaczej jest z programowaniem obiektowym. Cała zabawa polega na tym, by rozdzielić naszą aplikację na takie właśnie obiekty, które cechują jakieś właściwości i które mogą wykonywać jakieś akcje. Żeby lepiej zobrazować to, o czym mówię, przedstawię Wam Zenka. O Zenku pisałem w tekście PHP a bezpieczeństwo. Zenek jest właścicielem witryny, który wpadł na genialny pomysł. Wprowadzając do swojej strony internetowej obsługę użytkowników, postanowił stworzyć obiekt na swoje podobieństwo. Oto Zenek. Zenek Obiektowy:

Ilustracja 1: Zenek Obiektowy

Kiedy już skończycie podziwiać to moje dzieło sztuki, przejdźmy do rozważań na temat tego, co wiemy o Zenku. Zenek ma tytuł inżyniera. Jego numer buta to 44. Kolor włosów czarny. Jego ulubiona potrawa to spaghetti. Zenek, z uwagi na to, że zrobiłem go z prostokątów, nie ma bicepsów ani żadnych innych mięśni. Jest samozwańczym hakerem, który próbuje podbić świat. Te ambitne plany jednak nadal pozwalają mu oglądać telenowele, przy których - nawiasem mówiąc - płacze jak bóbr. Potrafi biegać, skakać, godzinami siedzieć przed komputerem, jeść oraz spać. Uzupełnijmy ilustrację o te informacje:

Ilustracja 2: Poznajemy Zenka

2. Czarno odziany, z obliczem potwora

Wiemy już, jaki jest nasz Zenek. Teraz przystępujemy do jego zakodowania w języku PHP. Tworzymy klasę Osoba.

class Osoba {
	public $imie = 'Zenek';
	public $tytul = 'Inżynier';
	public $cel = 'Podbicie świata';
	public $hobby = 'Wzruszające telenowele';
	public $potrawa = 'Spaghetti';
	public $biceps = '0cm';
	public $numer_buta = 44;
 
	public function biegnij() { echo 'Biegnę! '; }
	public function skacz() { echo 'Skaczę! '; }
	public function pracuj() { echo 'Zdobywam świ... eee... pracuję! '; }
	public function jedz() { echo 'Przerwa na spaghetti! '; }
	public function spij() { echo 'Idę spać. Do jutra! '; }
}

Powyższy zapis to przedstawienie Zenka jako obiektu w języku programowania PHP. Jak widzicie, utworzyliśmy osobę i wprowadziliśmy do niej domyślne dane. Krótkie wyjaśnienie:

  • class jest słowem kluczowym oznaczającym klasę. Instancję takiej klasy nazywa się obiektem. Klasa jest więc szablonem dla utworzonego obiektu (to tak, jak wycinanie gwiazdek z ciasta - potrzebna jest foremka, żeby wyszedł nam odpowiedni kształt).
  • Słówko public to tzw. modyfikator dostępu. Określa on, kto może użyć danej akcji (zwanej dalej metodą) oraz cechy (zwanej dalej atrybutem). Public oznacza, że do atrybutu bądź metody dostęp mają wszyscy.
  • Istnieją 3 podstawowe modyfikatory dostępu: private, protected oraz public. Private oraz protected zabraniają dostępu do atrybutu bądź metody z zewnątrz. Oznacza to, że tylko wewnątrz klasy możemy jednej z tych rzeczy użyć. Różnica między nimi polega na tym, że protected zezwala na dziedziczenie właściwości, zaś private nie. Dziedziczenie omówimy w następnej części. Jedyne, co musisz zapamiętać, to to, że private oraz protected nie pozwalają na zewnętrzny dostęp do atrybutu bądź metody.
  • Nie licząc modyfikatora dostępu, zapis metody praktycznie nie różni się od zapisu funkcji poza obiektem. Możemy przekazywać parametry do metod, każda z nich może coś zwracać. Różnica polega na samym zastosowaniu. Funkcje zebrane w obiekcie jako metody powinny należeć do jednego obiektu. Mogą też używać zmiennej $this w celu uzyskania dostępu do innych metod i atrybutów. Przez należenie do jednego obiektu rozumiem to, że jeżeli Zenek nie potrafi gotować albo liczyć całek, to nie powinien mieć akcji gotuj() oraz licz_calke().

Jak widać, zapisanie Zenka jako klasy nie jest wcale takie straszne. Zapis nieznacznie różni się od tego, do czego przywykliśmy dotychczas.

3. Myślę, więc jestem

Zanim przejdę do dalszych wyjaśnień, zobaczmy, jak to działa. Utworzymy obiekt klasy Osoba i zmusimy go do tego, by troszkę pobiegał i coś zjadł. Sprawdzimy też jego numer buta. By dostać się do metod lub atrybutów obiektu, używamy strzałeczki ->. Wzór jest prosty: $zmienna_obiektu->wartosc. By utworzyć obiekt klasy, musimy użyć operatora new wraz z jej nazwą. Nawiasy za nazwą mogą posłużyć do przekazania parametrów. O tym jednak w następnej części tekstu.

	$Zenek = new Osoba();
	echo "Mój numer buta to $Zenek->numer_buta ";
	$Zenek->biegnij();
	$Zenek->biegnij();
	$Zenek->biegnij();
	$Zenek->spij();

Tak wygląda wynik naszego kodu:

Mój numer buta to 44 Biegnę! Biegnę! Biegnę! Idę spać. Do jutra!

Jak już wspomniałem, metody mają dostęp do innych metod za pośrednictwem zmiennej $this. Spróbujmy sprawić, by biegnąc, Zenek skakał. Podmieniamy metodę biegnij() na następujący kod:

	public function biegnij() { 
		echo 'Biegnę! '; 
		$this->skacz(); 
	}

Jeżeli po tej zmianie uruchomimy nasz kod, to otrzymamy następujący ciąg znaków:

Mój numer buta to 44 Biegnę! Skaczę! Biegnę! Skaczę! Biegnę! Skaczę! Idę spać. Do jutra!

3. Wada? Jaka wada?

Zostaje nam na dzisiaj jeden problem. Zenkowi nie do końca podoba się to, że każdy ma wgląd w jego tajne plany podboju świata. Niezdrowe zainteresowanie władz nie jest wskazane. Koledzy śmialiby się z niego, że płacze przy telenowelach. Na pewno też nie poderwie żadnej kobiety na atletyczną budowę ciała, więc chciałby też ukryć brak bicepsów. W tym celu posłużymy się modyfikatorem private. Na obrazku pokażę Zenka po zmianach. Kolorem czerwonym zaznaczone są te cechy, które chciałby on ukryć.

Ilustracja 3: Wady? Jakie wady?

Żeby odwzorować zamierzenia Zenka na jego stronie internetowej, odpowiednio zmodyfikujemy klasę Osoba. Przed odpowiednimi atrybutami ustawimy modyfikator private. Oznacza to, że są one jego prywatną sprawą i nic nam do tego.

class Osoba {
	public $imie = 'Zenek';
	public $tytul = 'Inżynier';
	private $cel = 'Podbicie świata';
	private $hobby = 'Wzruszające telenowele';
	public $potrawa = 'Spaghetti';
	private $biceps = '0cm';
	public $numer_buta = 44;
 
	public function biegnij() { echo 'Biegnę! '; }
	public function skacz() { echo 'Skaczę! '; }
	public function pracuj() { echo 'Zdobywam świ... eee... pracuję! '; }
	public function jedz() { echo 'Przerwa na spaghetti! '; }
	public function spij() { echo 'Idę spać. Do jutra! '; }
}

Jeżeli spróbujemy się teraz dowiedzieć, jaki cel przyświeca Zenkowi, czeka nas rozczarowanie:

	$Zenek = new Osoba();
	echo $Zenek->cel;

Próba poznania tajnych planów podboju świat Zenka (o których swoją drogą radzę Wam teraz zapomnieć) zakończyła się błędem:

Fatal error: Cannot access private property Osoba::$cel

Nie przeszkadza nam to jednak w poznawaniu tytułu Zenka czy jego imienia.

4. Na poważnie

Dajmy spokój Zenkowi i bądźmy przez chwilę poważni. Nauczyliśmy się w tym tekście rozpoznawać obiekty, analizować je pod względem tego, co potrafią oraz jakie mają cechy. Następnie utworzyliśmy obiekt z klasy. Poznaliśmy podstawy w stosowaniu modyfikatorów dostępu, wiemy, jak posłużyć się zmienną $this. Utworzyliśmy obiekt i nie baliśmy się go użyć.

Jednak ktoś z Was zada zapewne pytanie: Jakie to wszystko ma zastosowanie praktyczne? Złożone strony internetowe posiadają masę skryptów. Pozwalają na rejestrowanie użytkowników, pisanie artykułów, publikowanie komentarzy, tworzenie wykresów, prowadzenie sklepu itp. Każdy taki element strony da się zapisać jako obiekt. Weźmy na przykład artykuł. Przeczytajcie poniższy kawałek kodu i odpowiedzcie sobie na pytanie, jak się Wam go czyta:

$Osoba = new Osoba();
$Osoba->laduj('Zenek');

$Artykul = new Artykul('PHP – Programowanie obiektowe dla początkujących');
$Artykul->laduj_tresc_z_pliku('tresc.txt');
$Artykul->autor($Osoba);
$Artykul->zapisz();
$Artykul->->opublikuj();

Zastosowanie zmiennej $this tak, by była ona zwracana przez poszczególne akcje, może zaowocować nawet takim zapisem:

$Artykul = new Artykul('PHP – Programowanie obiektowe dla początkujących');
$Artykul->laduj_tresc_z_pliku('tresc.txt')->autor($Osoba)->zapisz()->opublikuj();

Dodatkowo takiego kodu można wielokrotnie używać. Zamiast powtarzać instrukcje tworzące użytkownika, stosować setki zmiennych itp., wystarczy nam coś takiego:

$Osoba_Zenek = new Osoba();
$Osoba_Zenek->imie = 'Zenek';
$Osoba_Zenek->zapisz();

$Osoba_Ania = new Osoba();
$Osoba_Ania->imie = 'Ania';
$Osoba_Ania->zapisz();

$Osoba_Franek = new Osoba();
$Osoba_Franek->imie = 'Franek';
$Osoba_Franek->zapisz();

W skrócie: rozdzielamy naszą aplikację na wiele obiektów, gdzie każdy z nich spełnia określone funkcje. Teraz wyobraźcie sobie, że użytkownika opisuje 30 atrybutów. Spokojnie „pakujemy je” do jednego obiektu. Nie stosujemy takich kwiatków, jak np. $osoba_zenek_imie, $osoba_zenek_numer_buta, $osoba_ania_imie itp. Już zapewne wiecie, skąd funkcje typu mysql_real_escape_string() w PHP. Wiecie, skąd w niektórych systemach CMS funkcje takie, jak „main_article_save(); shop_comment_save(); forum_post_save();” itp. Każdej akcji, do której tworzyliśmy funkcję, musieliśmy nadać unikatową nazwę. Musieliśmy też pilnować, by nigdy się ona nie powtarzała. Teraz artykuły, użytkownicy, kometarze itp. mogą zostać zapisane metodą zapisz() czy załadowane poprzez laduj(). Jedyne, co musi być unikatowe w obrębie skryptu, to nazwa zmiennej, która stanie się naszym obiektem oraz sama nazwa obiektu. Koniec z zapamiętywaniem setek zmiennych. A to dopiero wierzchołek góry lodowej.

Nie ma się co dłużej rozpisywać. Tak naprawdę zawsze będą zwolennicy oraz sceptycy programowania obiektowego. Pełne zrozumienie jego zalet będziesz miał, dopiero gdy je dobrze poznasz. Wtedy sam zdecydujesz, czy warto je stosować, czy też może to nie dla Ciebie. W następnej części o programowaniu obiektowym, powiem więcej na temat konstruktorów oraz destruktorów. Opowiem o użyciu zmiennej $this wewnątrz klasy oraz o tym, czym są tzw. metody magiczne w PHP. W przyszłości mam nadzieję, pojawią się też teksty dotyczące wzorców projektowych.

Dariusz Półtorak


Aktualności | Porady | Gościnnie | Katalog
Bukmacherzy | Sprawdź auto | Praca
biurowirtualnewarszawa.pl wirtualne biura w Śródmieściu Warszawy


Artykuł może w treści zawierać linki partnerów biznesowych
i afiliacyjne, dzięki którym serwis dostarcza darmowe treści.

              *              

Źródło: DI24.pl