10. Programowanie obiektowe w PHP5



Podobne dokumenty
Kurs WWW. Paweł Rajba.

PHP 5 język obiektowy

Podstawy programowania III

Programowanie obiektowe

OBIEKTY PHP. G. Panuś

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Wykład 5: Klasy cz. 3

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Wykład 8: klasy cz. 4

Klasy abstrakcyjne i interfejsy

Programowanie obiektowe

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Aplikacje w środowisku Java

Enkapsulacja, dziedziczenie, polimorfizm

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Programowanie obiektowe - 1.

Interfejsy i klasy wewnętrzne

Podstawy Programowania Obiektowego

Zaawansowane programowanie w C++ (PCP)

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Klasy abstrakcyjne, interfejsy i polimorfizm

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Dziedziczenie jednobazowe, poliformizm

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

TEMAT : KLASY DZIEDZICZENIE

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie obiektowe

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Rozdział 4 KLASY, OBIEKTY, METODY

Materiały do zajęć VII

Programowanie obiektowe

Programowanie obiektowe

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Programowanie 2. Język C++. Wykład 3.

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Dokumentacja do API Javy.

Instrukcja 3 PROGRAMOWANIE OBIEKTOWE

C++ Przeładowanie operatorów i wzorce w klasach

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Wykład 4: Klasy i Metody

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w języku C++ Klasy w C++

Język C++ Programowanie obiektowe

Programowanie WEB Lista nr 10 (termin ) mgr inż. Adam Dudek

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe

.NET Klasy, obiekty. ciąg dalszy

Dziedziczenie. Tomasz Borzyszkowski

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Java: interfejsy i klasy wewnętrzne

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

Wykład 6: Dziedziczenie

Dziedziczenie. dr Jarosław Skaruz

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Definiowanie własnych klas

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Dziedziczenie. Ogólna postać dziedziczenia klas:

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

1 Atrybuty i metody klasowe

Języki i metody programowania Java. Wykład 2 (część 2)

Programowanie obiektowe i zdarzeniowe

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Wykład 9: Polimorfizm i klasy wirtualne

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Programowanie obiektowe

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Język programowania. Andrzej Bobyk

Aplikacje w środowisku Java

Polimorfizm. dr Jarosław Skaruz

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Technologie obiektowe

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Zaawansowane programowanie w języku C++ Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 2

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Programowanie w Internecie. Java

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie Obiektowe i C++

Programowanie obiektowe

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Technologie i usługi internetowe cz. 2

Transkrypt:

Ogólnie definicja klasy wygląda jak w C++. Oczywiście elementy składowe klasy są zmiennymi PHP, stąd nieśmiertelne $. Warto zauważyć, że mogą one mieć wartość HHH mgr inż. Grzegorz Kraszewski TECHNOLOGIE INTERNETOWE 3 wykład 10: Programowanie obiektowe w PHP5. 10. Programowanie obiektowe w PHP5 Dlaczego PHP5? Pierwsze nieśmiałe próby implementacji technik obiektowych mieliśmy już w PHP4, ale były one niekonsekwentne i niekompletne, PHP4 było językiem proceduralnym z obiektowością doklejoną z boku. Dopiero w PHP5 pojawiła się obiektowość z prawdziwego zdarzenia. Ponieważ optymistycznie zakładam, że słuchacze pamiętają jeszcze co nieco z kursu C++, podzielę techniki obiektowe w PHP na trzy grupy: rzeczy, które wyglądają jak w C++ i działają tak samo, rzeczy, które wyglądają jak w C++, ale działają inaczej, rzeczy, których nie ma w C++. Zaczniemy od tych pierwszych, a więc od samej definicji klasy. Oto prosty przykład: 10.1. Definicja klasy class NaszaKlasaPl $element = 6; $drugi = 'a kto umarł, ten nie żyje'; $bezwartosci;

domyślną, co jest pewną nowością. Nadanie wartości domyślnej określa nam typ składowej (ale zgodnie z zasadami PHP, może on później ulec zmianie). Element bez wartości domyślnej jest typu NULL. Trzeba pamiętać o tym, że wartość domyślna musi być wyrażeniem stałym, nie może więc zawierać operatorów, ani nazw zmiennych. function JakasMetoda($parametr) echo $parametr.$drugi; Definicje metod są analogiczne do C++, oczywiście w PHP parametry nie mają typów, co między innymi skutkuje tym, że nie można przeciążać metod (nie można mieć kilku metod o takich samych nazwach a różnych typach parametrów). Na zakończenie zauważmy, że definicja klasy w PHP nie jest zakończona średnikiem. 10.2. Tworzenie nowych obiektów i operator new Podobnie jak w C++ operator new służy nam do tworzenia nowych obiektów. Natomiast inaczej, niż w C++, operator new jest jedynym sposobem ich tworzenia, obiekty globalne i automatyczne (lokalne) nie mają w PHP miejsca ze względu na strukturę języka. Oto przykład: $szybki_serwer = new NaszaKlasaPl();

10.3. Klasy pochodne Trudno mówić o obiektowości języka bez klas pochodnych. W PHP5 tworzymy klasy pochodne używając słowa kluczowego extends. Nie jest możliwe dziedziczenie wielokrotne (po kilku klasach jednocześnie). class DaneOsobowe extends NaszaKlasaPl $nowy_element = 'bzz'; function NowaMetoda() echo 'Nowa'; function JakasMetoda($parametr) parent::jakasmetoda($parametr); echo 'I dodatek.'; Klasa pochodna może dodawać nowe elementy i metody, może też nadpisywać stare metody. Jeżeli metoda jest redefiniowana, to PHP nie wykona automatycznie metody klasy nadrzędnej (tak samo jak w C++), jeżeli chcemy to uzyskać, posługujemy się słowem kluczowym parent i operatorem zakresu ( :: ).

10.4. Zachowanie się obiektów przy przypisaniu Obiekty zachowują się przy przypisaniu inaczej niż pozostałe typy zmiennych, mianowicie operator przypisania nie kopiuje obiektów. Wynika to z faktu, że zmienna typu object nie przechowuje samego obiektu, a jedynie jego uchwyt. Ilustruje to rysunek. $nowa = $zmienna uchwyt kopiowanie uchwyt obiekt Jeżeli chcemy mieć kopię obiektu, musimy ją stworzyć jawnie poprzez klonowanie, służy do tego operator clone(). Jego standardowa wersja kopiuje obiekt składowa po składowej, ale można napisać własną metodę clone(), jeżeli kopiowanie ma się odbyć w jakiś specyficzny sposób.

10.5. Konstrukcja i destrukcja obiektów Tak samo jak C++, PHP pozwala nam na zdefiniowanie w klasie konstruktora (ale tyko jednego, przeciążanie odpada), oraz destruktora. Te dwie metody możemy pominąć, wtedy zostaną użyte metody domyślne, które nic nie robią. W PHP nazwy tych dwóch specjalnych metod nie mają nic wspólnego z nazwą klasy, są to construct() oraz destruct().konstruktor jest wywoływany zaraz po stworzeniu obiektu, destruktor tuż przed jego zniszczeniem. Tak jak dla zwykłych metod, konstruktor i destruktor klasy nadrzędnej nie są wywoływane automatycznie i w razie potrzeby robimy to ręcznie używając parent::. Konstruktor i destruktor nie zwracają żadnej wartości, destruktor nie ma żadnych parametrów. class Student $imie; $nazwisko; function construct($i, $n) $this->imie = $i; $this->nazwisko = $n; function destruct() print("z przykrością zawiadamiamy, że $this->imie $this->nazwisko został zlikwidowany.");

10.6. $this, self:: i konieczność ich użycia Ze względu na zasięg zmiennych w PHP, do elementów klasy odwołujemy się zawsze poprzez pseudo-zmienną $this, której znaczenie jest takie samo jak w C++, z tym że bez posiadania dosłownego znaczenia wskaźnika. Warto zauważyć, że nazwa składowej nie jest już poprzedzana dolarem, można traktować to, w ten sposób, że nazwą zmiennej jest this->zmienna jako całość. class Iks $x = 'jestem x'; function Opisz() echo $this->x; O ile $this odnosi się do konkretnego obiektu, self:: odnosi się do klasy i służy do odwoływania się do jej elementów statycznych, a więc metod, oraz składowych statycznych, o których dalej. Oto objaśniający sprawę przykład (kontynuujemy definicję klasy Iks): function Witam() $b = $this->x; // dobrze $b = self::x; // źle, x nie jest statyczny Opisz(); // źle wbrew pozorom $this->opisz(); // dobrze, również wbrew pozorom self::opisz(); // ale tak jest przejrzyściej

10.7. Kontrola dostępu do składowych Mamy tu sytuację analogiczną do C++. Dysponujemy słowami kluczowymi public, protected i private. Ich znaczenie jest podobne do C++, składowe publiczne dostępne są wszędzie, chronione tylko w klasie i klasach pochodnych, prywatne tylko w klasie. Domyślnie, jeżeli brak słowa kluczowego, składowa jest publiczna. Konstruktory i destruktory w PHP muszą być publiczne jeżeli są zdefiniowane. class W public $pub; protected $pro; private $pri; class X extends W function M() $p = $this->pub; // OK $p = $this->pro; // OK $p = $this->pri; // chała! $obj = new W(); $cokolwiek = $obj->pub; // OK

$cokolwiek = $obj->pro; $cokolwiek = $obj->pri; 10.8. Składowe statyczne // to se ne da // oczywiście też nie Składowe takie definiuje się używając słowa static. Powoduje to dwie rzeczy. Po pierwsze składowa statyczna jest jedna dla wszystkich obiektów (w przypadku zwykłej składowej każdy obiekt ma swoją kopię). Po drugie składowa statyczna istnieje nawet gdy nie ma żadnego obiektu danej klasy. class Beee public $fooo = 'fooo'; static public $beee = 'beee'; // nie ma żadnych obiektów klasy Beee echo Beee::$fooo; echo Beee::$beee; // błąd! // dobrze Statyczne mogą być również metody, co prawda w pewnym sensie statyczna jest każda metoda, bo wszystkie obiekty danej klasy mają tę samą kopię jej kodu, niemniej użycie słowa static pozwala na wykonanie metody bez posiadania jakiegokolwiek obiektu klasy. Konsekwencją jednak jest niedziałanie w takiej metodzie $this (skoro można ją wywołać bez obiektu...), a więc nie ma ona dostępu do składowych niestatycznych.

class MetodeMaStatyczna public $normalna; public static $statyczna; function Metoda() $this->normalna = 'blablabla'; $this->statyczna = 'adzia!'; static function Statyczna() $this->normalna = 'umc, umc, umc'; // niestety nie przejdzie self::$normalna = 'umc, umc, umc'; // padnie przy wywołaniu self::$statyczna = 'sesja jedyną miłością studenta'; // OK // obiektów brak MetodeMaStatyczna::Metoda(); // nie można MetodeMaStatyczna::Statyczna(); // można $obj = new MetodeMaStatyczna(); $obj->metoda(); $obj->statyczna(); // można // też można

10.9. Klasy abstrakcyjne To temat również znany z C++, klasy abstrakcyjne to takie, które nie mogą mieć własnych obiektów, mogą mieć tylko obiekty klas pochodnych. Klasa abstrakcyjna powstaje wtedy, gdy co najmniej jedna jej metoda jest abstrakcyjna: abstract class Abstrakcja abstract function M1(); function M2() // coś w środku // brak definicji Klasa pochodna od takiej ma dwa wyjścia. Albo zaimplementować wszystkie metody abstrakcyjne (wtedy jest już zwykłą klasą, mogącą posiadać obiekty), albo po prostu pominąć którąś z metod abstrakcyjnych (wtedy klasa pochodna również jest abstrakcyjna). 10.10. Interfejsy Interfejs jest to jak gdyby szablon (niewiele mający wspólnego z szablonem w C++), który jest jak gdyby instrukcją budowania własnych klas. Interfejs to po prostu zestaw metod z argumentami, klasa która implementuje interfejs musi posiadać wszystkie metody z wykazu. Interfejsów używa się więc do porządkowania kodu, jeżeli narzucimy

kilku klasom jeden interfejs, mamy gwarancję, że do obiektów wszystkich tych klas będziemy się mogli odwoływać przez ten sam zestaw metod. interface Ofiara public function uderz_go($gdzie); public function zaatakuj_go($jak); public function przegral(); class Bokser implements Ofiara // tutaj musimy zaimplementować wszystkie metody z interfejsu $Andrzej = new Bokser(); // mamy pewność, że możemy używać metod określonych w interfejsie $Andrzej->uderz_go('korpus'); $Andrzej->zaatakuj_go('prawy prosty'); $Andrzej->uderz_go('glowa'); $Andrzej->przegral(); // koniec walki na dziś