Polega na reprezentowaniu programu jako zbioru obiektów. Każdy obiekt należy do klasy, która z kolei zajmuje swoje miejsce w odziedziczonej hierarchii. Korzystanie z OOP minimalizuje zbędne dane, co poprawia sterowność i zrozumienie programu.
Powstał w wyniku rozwoju programowania proceduralnego. Podstawą języków obiektowych są następujące zasady:
Niektóre zasady, które zostały pierwotnie określone w pierwszej OYA, uległy znaczącym zmianom.
Przykłady języków obiektowych:
Każda książka taka jak „Programowanie obiektowe dla opornych” podkreśla jedną z głównych zasad – abstrakcję. Chodzi o to, aby podzielić szczegóły lub cechy realizacji programu na te, które są ważne i te, które nie są. Niezbędny przy dużych projektach, pozwala na pracę na różnych poziomach reprezentacji systemu bez określania szczegółów.
Abstrakcyjny typ danych jest reprezentowany jako interfejs lub struktura. Pozwala nie myśleć o poziomie szczegółowości wdrożenia. ADT jest niezależny od innych sekcji kodu.
Słynny aforyzm Davida Wheelera głosi: Wszystkie problemy w informatyce można rozwiązać na innym poziomie abstrakcji.
Języki obiektowe są dziedziczone – to jedna z najważniejszych zasad.
Wskazuje, że można ponownie wykorzystać pewien typ funkcjonalności. Klasa, która dziedziczy właściwości innej, nazywana jest klasą pochodną, potomkiem lub podklasą. Ta, z której następuje dziedziczenie, nazywana jest przodkiem, bazą lub nadklasą. Relacja zstępny – spadkobierca powoduje powstanie szczególnej hierarchii.
Istnieje kilka rodzajów dziedziczenia:
W przypadku dziedziczenia wielokrotnego od jednego przodka może być kilkoro dzieci, natomiast przy dziedziczeniu prostym może być tylko jedno. To jest główna różnica między typami.
Dziedziczenie wygląda następująco:
funkcja rysuj() (
zwróć „tylko zwierzę”;
funkcja jedz() (
zwróć „zwierzę je”;
klasa Krowa rozciąga się Zwierzę (
funkcja rysuj() (
Zwróć „coś, co wygląda jak krowa”;
Widzimy, że klasa Cow odziedziczyła wszystkie metody z klasy Animal. Teraz, jeśli wykonamy Cow.eat(), otrzymamy „zwierzę je”, więc metoda Draw() zostanie zmieniona. Cow.draw() zwróci „coś, co wygląda jak krowa”, a Animal.draw() zwróci „tylko zwierzę”.
Hermetyzacja ogranicza dostęp komponentów do innych, kojarzy dane z metodami przetwarzania. Specyfikator dostępu prywatnego jest używany do enkapsulacji.
Zwykle pojęcia enkapsulacji i ukrywania są utożsamiane, ale w niektórych językach rozróżnia się te pojęcia. Innymi słowy, właściwości krytyczne dla wydajności są chronione i nie można ich zmienić.
funkcja __construct($nazwa) (
$this->name = $name;
funkcja getName() (
zwróć $to->nazwa;
Nazwa jest akceptowana jako argumenty konstruktora. Gdy konstruktor zostanie użyty w innych częściach kodu, nic nie będzie w stanie zmienić elementu name. Jak widać, jest to wskazane wewnętrznie; nie jest dostępne dla innych części kodu.
Polimorfizm pozwala używać tej samej nazwy do rozwiązywania podobnych, ale technicznie różnych problemów.
Powyższy przykład zawiera tabelę. Widzimy klasę CardDesk i klasę GraphicalObject. Obydwa mają funkcję o nazwie Draw(). Wykonuje różne działania, chociaż ma tę samą nazwę.
Polimorfizm ad hoc lub specjalny polimorfizm wykorzystuje:
Przeciążanie polega na użyciu kilku funkcji o tej samej nazwie, gdy wybór odpowiednich następuje na etapie kompilacji.
Rzutowanie typu oznacza konwersję wartości jednego typu na wartość innego typu. Istnieje konwersja jawna - stosowana jest funkcja, która przyjmuje jeden typ i zwraca inny, niejawna - jest wykonywana przez kompilator lub interpreter.
„Jeden interfejs, wiele implementacji” Bjarne Stroustrup.
Klasa to typ danych składający się z pojedynczego zestawu pól i metod.
Posiada wewnętrzne i zewnętrzne interfejsy do zarządzania treścią. Podczas kopiowania poprzez przypisanie kopiowany jest interfejs, ale nie dane. Różne gatunki oddziałują na siebie poprzez:
Dziedzicząc, klasa potomna dziedziczy wszystkie właściwości powiązania nadrzędnego, co oznacza interakcję obiektów. Kiedy obiekt jednej klasy jest zawarty w innej, nazywa się to agregacją. Ale jeśli nadal są od siebie zależne pod względem żywotności, jest to kompozycja.
Jedną z głównych cech jest zasięg. Pojęcie to jest różnie definiowane w różnych językach.
W Object Pascal opisano to następująco:
NazwaKlasy = klasa(SuperKlasa)
(wykorzystanie elementów ograniczone jest wyłącznie w obrębie modułu)
(tutaj są wskazane pola)
(specyfikator dostępu stał się dostępny w Delphi 2007, co oznacza to samo, co prywatny)
(elementów można używać wewnątrz ClassName lub podczas dziedziczenia)
(elementy są dostępne dla wszystkich, są wyświetlane w Inspektorze obiektów)
Tutaj SuperClass jest przodkiem, od którego następuje dziedziczenie.
W przypadku C++ utworzenie wygląda następująco:
klasa MojaKlasa: publiczny rodzic
MojaKlasa(); // konstruktor
~MojaKlasa(); // destruktor
W tym przykładzie Parent jest przodkiem, jeśli taki istnieje. Specyfikatory private, public, chronione oznaczają to samo, co w poprzednim przykładzie w Pascalu. Widzimy także konstruktor i destruktor dostępny dla dowolnej części programu. W C++ wszystkie elementy są domyślnie prywatne, więc można to pominąć.
W centrum języków obiektowych znajduje się obiekt, będący częścią klasy. Składa się z:
Pole danych opisuje parametry obiektu. Reprezentują pewną wartość należącą do klasy oraz opisują jej stan i właściwości. Domyślnie są one zamknięte, a zmiana danych następuje różnymi metodami.
Metoda to zestaw funkcji definiujących wszystkie możliwe akcje, które można wykonać na obiekcie. Wszystkie obiekty oddziałują na siebie poprzez wzajemne wywoływanie metod. Mogą być zewnętrzne lub wewnętrzne, co określają modyfikatory dostępu.
Istnieją następujące metodologie:
Programowanie zorientowane komponentowo opiera się na koncepcji komponentu – komponentu programu, który jest przeznaczony do ponownego wykorzystania. Jest realizowany jako zbiór struktur o wspólnych cechach, zasadach i ograniczeniach. Podejście to jest stosowane w obiektowym języku Java, gdzie orientacja komponentów jest realizowana poprzez „JavaBeans” napisane według tych samych zasad.
W programowaniu prototypowym nie ma pojęcia klasy - dziedziczenie osiąga się poprzez klonowanie istniejącego prototypu. Jest podstawą języków obiektowych javascript i innych dialektów ecmascript, a także lua lub lo. Główne cechy:
Programowanie zorientowane klasowo koncentruje się na instancji. Klasa definiuje wspólną strukturę i zachowanie instancji, które ją przyjmują.
Wszystkie OOP są w pełni zgodne z zasadami OOP - elementy są obiektami posiadającymi właściwości. W takim przypadku mogą pojawić się dodatkowe środki.
OOYA koniecznie zawiera zestaw następujących elementów:
Oprócz powyższej listy można dodać dodatkowe narzędzia:
Niektóre OYA spełniają wszystkie podstawowe elementy, inne częściowo. Jeszcze inne mają charakter hybrydowy, to znaczy są połączone z podsystemami innych paradygmatów. Ogólnie rzecz biorąc, zasady OOP można zastosować również w języku nieobiektowym. Jednak użycie OTL nie powoduje jeszcze, że kod jest zorientowany obiektowo.
Języki językowe obsługują więcej niż jeden paradygmat. Na przykład PHP lub JavaScript obsługują programowanie funkcjonalne, proceduralne i obiektowe. Java działa w oparciu o pięć paradygmatów: obiektowy, ogólny, proceduralny, aspektowy i współbieżny. C# jest uważany za jeden z najbardziej udanych przykładów multiparadygmatu. Obsługuje te same podejścia co Java, dodając do tej listy paradygmat refleksyjny. Język taki jak Oz został zaprojektowany tak, aby połączyć wszystkie koncepcje tradycyjnie kojarzone z różnymi paradygmatami oprogramowania.
Programowanie obiektowe(OOP) pozwala rozłożyć problem na części składowe, z których każda staje się niezależnym obiektem. Każdy z obiektów zawiera swój własny kod i dane, które odnoszą się do tego obiektu.
Każdy program napisany w języku OOP odzwierciedla w swoich danych stan obiektów fizycznych lub pojęć abstrakcyjnych – obiektów programistycznych, z którymi ma pracować.
Wszystkie dane dotyczące obiektu programistycznego i jego relacji z innymi obiektami można połączyć w jedną zmienną strukturalną. W pierwszym przybliżeniu można go nazwać przedmiotem.
Obiekt jest powiązany ze zbiorem akcji, zwanych inaczej metodami. Z punktu widzenia języka programowania zestaw akcji lub metod to funkcje, które jako wymagany parametr otrzymują wskaźnik do obiektu i wykonują określone akcje na danych obiektu programowania. Technologia OOP zabrania pracy z obiektem w inny sposób niż metodami, dlatego wewnętrzna struktura obiektu jest ukryta przed użytkownikiem zewnętrznym.
Opis zbioru obiektów tego samego typu nazywany jest klasą.
Obiekt to zmienna strukturalna, która zawiera wszystkie informacje o jakimś obiekcie fizycznym lub koncepcji zaimplementowanej w programie.
Klasa to opis zbioru obiektów programistycznych (obiektów) i wykonywanych na nich akcji.
Klasę można porównać do planu, według którego tworzone są obiekty. Zazwyczaj klasy są tworzone w taki sposób, aby ich obiekty odpowiadały obiektom dziedziny rozwiązywanego problemu.
Każda funkcja w programie jest metodą obiektu jakiejś klasy.
Klasę należy tworzyć w programie w sposób naturalny, gdy tylko zajdzie potrzeba opisania nowych obiektów programistycznych. Każdy nowy krok w rozwoju algorytmu musi reprezentować rozwój nowej klasy w oparciu o istniejące.
Cały program w tej postaci jest obiektem jakiejś klasy z jedną metodą uruchomienia.
Programowanie w klasie obejmuje szereg nowych koncepcji. Główne koncepcje OOP to
Enkapsulacja danych(od „kapsuły”) to mechanizm łączący dane i kod manipulujący tymi danymi, a także chroniący oba przed ingerencją zewnętrzną lub niewłaściwym użyciem. W OOP kod i dane można łączyć ze sobą (w tak zwanej „czarnej skrzynce”) podczas tworzenia obiektu.
W obiekcie kody i dane mogą być prywatne lub publiczne.
Zastrzeżony kod lub dane są dostępne tylko dla innych części tego samego obiektu i w związku z tym nie są dostępne dla tych części programu, które istnieją poza obiektem.
Z drugiej strony, otwarty kod źródłowy i dane są dostępne dla wszystkich części programu, w tym innych części tego samego obiektu.
Dziedziczenie. Nową lub pochodną klasę można zdefiniować w oparciu o istniejącą lub bazową klasę.
W tym przypadku nowa klasa zachowuje wszystkie właściwości starej: dane obiektu klasy bazowej są zawarte w danych obiektu pochodnego, a na obiekcie klasy pochodnej można wywoływać metody klasy bazowej, co zostanie wykonany na danych zawartego w nim obiektu klasy bazowej.
Innymi słowy, nowa klasa dziedziczy zarówno dane starej klasy, jak i metody ich przetwarzania.
Jeżeli obiekt dziedziczy swoje właściwości od jednego z rodziców, wówczas mówi się, że tak jest pojedyncze dziedzictwo. Jeżeli obiekt dziedziczy dane i metody z kilku klas bazowych, wówczas mówi się, że tak jest dziedziczenie wielokrotne.
Przykładem dziedziczenia jest definicja struktury, której pojedynczym elementem jest wcześniej zdefiniowana struktura.
Polimorfizm to właściwość, która pozwala na użycie tego samego identyfikatora (tej samej nazwy) do rozwiązania dwóch lub więcej podobnych, ale różnych technicznie problemów.
Celem polimorfizmu w zastosowaniu do OOP jest użycie jednej nazwy do określenia działań wspólnych dla wielu klas obiektów. Polimorfizm taki polega na możliwości zawarcia w danych obiektowych informacji o sposobach ich przetwarzania (w postaci wskaźników do funkcji).
Będąc dostępnym w pewnym momencie programu, obiekt, nawet przy braku pełnej informacji o jego typie, zawsze może poprawnie wywołać swoje nieodłączne metody.
Funkcja polimorficzna to rodzina funkcji o tej samej nazwie, ale wykonujących różne akcje w zależności od warunków wywołania.
Na przykład znalezienie wartości bezwzględnej w C wymaga trzech różnych funkcji o różnych nazwach.
Programowanie obiektowe (OOP) jest obecnie najpopularniejszą technologią programowania.
Programowanie obiektowe jest rozwinięciem technologii programowania strukturalnego, ma jednak swoje własne charakterystyczne cechy.
Najpopularniejszymi obiektowymi systemami programowania wizualnego są Microsoft Visual Basic i Borland Delphi.
W swej istocie programowanie obiektowe polega na tworzeniu aplikacji z obiektów, tak jak domy buduje się z bloków i różnych części. Niektóre obiekty trzeba stworzyć całkowicie samodzielnie, inne zaś można wypożyczyć w formie gotowej z różnych bibliotek. Ważne miejsce w technologii programowania obiektowego zajmują wydarzenie.
Zdarzeniami mogą być kliknięcie obiektu myszą, naciśnięcie określonego klawisza, otwarcie dokumentu itp. W reakcji na zdarzenia wywoływana jest określona procedura, która może zmienić właściwości obiektu, wywołać jego metody itp.
Systemy programowania obiektowego zazwyczaj wykorzystują interfejs graficzny do wizualizacji procesu programowania.
Możliwe staje się tworzenie obiektów, ustawianie ich właściwości i zachowania za pomocą myszki.
Hermetyzacja to połączenie właściwości obiektu i możliwych operacji (metod) na nim.
Kolejną zasadą leżącą u podstaw OOP jest możliwość stworzenia nowej klasy obiektów z dziedziczeniem właściwości i metod jakiejś już istniejącej klasy.
Dziedziczenie to zdolność do wyprowadzania jednej klasy z drugiej przy jednoczesnym zachowaniu wszystkich właściwości i metod klasy przodka (progenitor, czasami nazywanej nadklasą) i dodaniu, jeśli to konieczne, nowych właściwości i metod.
Zbiór klas powiązanych dziedziczeniem nazywa się hierarchią.
Dziedziczenie ma odzwierciedlać taką właściwość świata rzeczywistego, jak hierarchia.
Kolejną zasadą OOP jest zasada polimorfizmu.
Polimorfizm to zjawisko, w którym funkcji (metodzie) o tej samej nazwie odpowiada inny kod programu (kod polimorficzny) w zależności od tego, jaki obiekt klasy zostanie użyty przy wywołaniu tej metody.
Polimorfizm zapewnia fakt, że w klasie potomnej zmienia się implementacja metody klasy przodka z obowiązkowym zachowaniem sygnatury metody. Dzięki temu interfejs klasy przodka pozostaje niezmieniony i pozwala na powiązanie nazwy metody w kodzie z różnymi klasami - z obiektu, której klasy następuje wywołanie, z tej klasy pobierana jest metoda o podanej nazwie. Mechanizm ten nazywany jest łączeniem dynamicznym (lub późnym) – w przeciwieństwie do łączenia statycznego (wczesnego), które jest wykonywane w czasie kompilacji
Podejście obiektowe pozwala połączyć model statyczny opisujący właściwości obiektu z modelem dynamicznym opisującym ich zmiany.
Przy takim podejściu dostęp do zmiany właściwości obiektu możliwy jest jedynie poprzez metody należące do tego obiektu. Metody „otaczają” właściwości obiektu;
Mówi się, że właściwości są „zamknięte” w obiekcie. Zatem w programowaniu obiektowym centralne miejsce zajmują obiekty, które łączą w jedną całość (hermetyzują) właściwości obiektu i możliwe na nim operacje (metody). Obiekty zawierające tę samą listę właściwości i operacji są łączone zajęcia. Każdy indywidualny obiekt jest
Na przykład system plików komputera może zawierać setki lub tysiące plików. Wszystkie pliki mają ten sam zestaw właściwości (nazwa, pozycja w systemie plików itp.) i operacji (zmiana nazwy, przenoszenie lub kopiowanie itp.) i tworzą klasę obiektów Akta.
Każdy pojedynczy plik jest instancją tej klasy i ma określone wartości właściwości (nazwa, lokalizacja itp.).
Często zdarza się, że te same operacje można wykonać na obiektach różnych klas. Większość klas obiektów w środowisku Windows (foldery, dokumenty, symbole itp.) charakteryzuje się także zestawem tych samych operacji (zmiana nazwy, przenoszenie, kopiowanie, usuwanie itp.). Ta jednolitość jest bardzo przyjazna dla użytkownika.
Jednakże oczywiste jest, że mechanizmy realizacji tych operacji nie są takie same dla różnych klas.
Na przykład, aby skopiować folder, musisz wykonać sekwencję działań, aby zmienić system plików, a aby skopiować symbol, wprowadzić zmiany w dokumencie. Operacje te wykonają różne programy dostępne odpowiednio w systemie operacyjnym Windows oraz w edytorze tekstu Word. W ten sposób jest to realizowane
wielopostaciowość, te. możliwość wykonywania tych samych operacji na obiektach należących do różnych klas, przy zachowaniu indywidualnych metod ich realizacji dla każdej klasy. Tworzą się obiekty, które mają ten sam zestaw właściwości i metod klasa obiektu. Tak więc w aplikacji Word istnieje klasa obiektów dokument(Dokumenty), który ma następujące właściwości: Nazwa(Nazwa), lokalizacja cja(FileNaine) itp. Obiekty tej klasy również posiadają pewien zestaw metod, na przykład: otwarcie dokumentu policjant(Otwarte) drukowanie dokumentów(Wydruk), ochrona
dokument (Zapisz) itp. Obiekty w aplikacjach tworzą pewnego rodzaju hierarchię. Na szczycie hierarchii obiektów znajduje się (Zapisz) itp. aplikacja klasa obiektu.(Aplikacja). Zatem hierarchia obiektów aplikacji Word obejmuje następujące obiekty: (Aplikacja),(Dokumenty), fragment dokumentu(Wybór),
symbol (Zapisz) itp.(Postać) itp. Hierarchia obiektów aplikacji Excel zawiera następujące obiekty:(Aplikacja), książka(Podręcznik z ćwiczeniami), arkusz(Arkusz) zasięg komórek(Zakres), komórki
Pełne odniesienie do obiektu składa się z szeregu nazw obiektów zagnieżdżonych sekwencyjnie w sobie.
Separatorami nazw obiektów w tej serii są kropki; seria zaczyna się od obiektu aplikacji najwyższego poziomu, a kończy nazwą interesującego nas obiektu.. Na przykład łącze do dokumentu Пpo6a.doc w programie Word będzie wyglądać następująco: Aplikacja
Dokumenty
(„Ppo6a.doc”) Aby obiekt mógł wykonać jakąkolwiek operację, należy określić metodę. Wiele metod posiada argumenty umożliwiające określenie parametrów akcji, które mają zostać wykonane. Aby przypisać określone wartości argumentom, stosuje się dwukropek i znak równości, a argumenty oddziela się przecinkiem.
W Visual Basic obiekty charakteryzują się nie tylko właściwościami i metodami, ale także wydarzenia. Zdarzenie to czynność rozpoznawana przez obiekt. Zdarzenie może zostać wygenerowane przez użytkownika (np. naciśnięcie przycisku myszy lub klawisza na klawiaturze) lub być efektem działania innych obiektów aplikacji.1 Dla każdego zdarzenia możesz zaprogramować reakcję, czyli reakcję obiektu na zdarzenie, które miało miejsce. Ten program nazywa się procedura zdarzenia. Zdarzenie to czynność rozpoznawana przez obiekt. Zdarzenie może zostać wygenerowane przez użytkownika (np. naciśnięcie przycisku myszy lub klawisza na klawiaturze) lub być efektem działania innych obiektów aplikacji.1_ procedura zdarzenia.
Nazwa procedury zdarzenia składa się zazwyczaj z nazwy obiektu i nazwy zdarzenia. Na przykład dla obiektu przycisku o nazwie Zdarzenie to czynność rozpoznawana przez obiekt. Zdarzenie może zostać wygenerowane przez użytkownika (np. naciśnięcie przycisku myszy lub klawisza na klawiaturze) lub być efektem działania innych obiektów aplikacji.1_ procedura zdarzenia Rozkaz
i wydarzenia1. i wydarzenia Trzask
(„klik” powstający w momencie najechania kursorem myszy na obraz przycisku i naciśnięciu lewego przycisku myszy) procedura zdarzenia otrzyma nazwę i wydarzenia1 W procedurze zdarzenia może uczestniczyć kilka obiektów. Na przykład w procedurze wspomnianej powyżej
zespół może być obecny Tekst= „Witam!”, w wyniku wykonania what w „polu tekstowym” obiektu o nazwie Pojawi się linia ze słowem „Hello!”. , Programowanie wizualne, którego metody wykorzystywane są przez środowisko programistyczne Visual Basic, pozwala na tworzenie interfejsu graficznego dla tworzonych aplikacji w oparciu o wykorzystanie elementów sterujących, do których zaliczają się m.in. pikolak (Przycisk Polecenie), pola wyboru
Głównymi obiektami używanymi w programowaniu wizualnym są formy(Formularz). Formularz to okno, w którym umieszczone są elementy sterujące. Forma to także obiekt charakteryzujący się zestawem właściwości i metod. Podobnie jak w przypadku każdego innego obiektu, możesz na przykład napisać procedurę zdarzenia dla formularza Formularz_ Obciążenie, który jest uruchamiany w momencie wystąpienia zdarzenia Load i w wyniku którego zostaną wykonane instrukcje niezbędne do działania uruchomionej aplikacji.
Java jest językiem obiektowym. Oznacza to, że musisz pisać programy w Javie w stylu obiektowym. I ten styl opiera się na wykorzystaniu obiektów i klas w programie. Spróbujmy na przykładach zrozumieć czym są klasy i obiekty oraz jak zastosować w praktyce podstawowe zasady OOP: abstrakcję, dziedziczenie, polimorfizm i enkapsulację.
Aby mieć pewność, że styl Twojego programu będzie zgodny z koncepcją OOP i zasadami OOP Java, postępuj zgodnie z poniższymi wskazówkami: podkreślić główne cechy obiektu; podkreślaj wspólne właściwości i zachowania oraz korzystaj z dziedziczenia podczas tworzenia obiektów;
Programowanie obiektowe to styl kodowania, który pozwala programiście grupować podobne zadania zajęcia. Dzięki temu kod jest zgodny z zasadą DRY (nie powtarzaj się) i staje się łatwy w utrzymaniu.
Jedną z zalet programowania DRY jest to, że jeśli jakieś informacje wymagają zmiany programu, to trzeba to zrobić zmień kod tylko w jednym miejscu, aby zaktualizować algorytm. Jednym z najgorszych koszmarów programisty jest utrzymywanie kodu, który wielokrotnie deklaruje dane, przez co wszelkie zmiany w programie stają się niekończącą się grą w chowanego podczas polowania na zduplikowane dane i fragmenty algorytmu.
OOP przeraża wielu programistów, ponieważ wprowadza nową składnię i na pierwszy rzut oka wydaje się bardziej skomplikowany niż proste kodowanie proceduralne. Jednak po bliższym przyjrzeniu się OOP jest w rzeczywistości bardzo przejrzystym i niezwykle prostym podejściem do programowania.
Zanim zagłębimy się w jasne definicje OOP, konieczne jest podstawowe zrozumienie różnicy między nimi zajęcia I obiekty. Ta część artykułu pomoże Ci zorientować się w klasach, ich różnych możliwościach i niektórych zastosowaniach.
Deweloperzy, zaczynając mówić o klasach i obiektach, zaczynają zastępować koncepcje. Niestety, zdarza się to bardzo często.
Klasa jest np projekt domu. Określa na papierze, jak będzie wyglądał dom, jasno opisuje wszystkie relacje pomiędzy jego poszczególnymi częściami, nawet jeśli dom w rzeczywistości nie istnieje.
A obiekt jest prawdziwy dom, który jest zbudowany zgodnie z projektem. Dane zapisane w obiekcie są jak drewno, druty i beton, z których składa się dom: bez montażu zgodnie z projektem będzie on tylko stosem materiałów. Jednak po złożeniu tworzą doskonały i wygodny dom.
Klasy tworzą strukturę danych i akcji i wykorzystują te informacje do konstruowania obiektów. Z jednej klasy można zbudować więcej niż jeden obiekt jednocześnie, każdy z nich będzie niezależny od pozostałych. Kontynuując analogię z budownictwem, można by zbudować całą dzielnicę według jednego projektu: 150 różnych domów, które wyglądają tak samo, ale w każdym z nich mieszka inna rodzina, a wystrój wnętrz budynków jest inny.
Składnia tworzenia klasy jest bardzo prosta: aby zadeklarować klasę, użyj słowa kluczowego class, po którym następuje nazwa klasy i zestaw nawiasów klamrowych (()):
Po utworzeniu klasy można utworzyć instancję nowego obiektu i zapisać go w zmiennej za pomocą słowa kluczowego new:
$obj = nowa MojaKlasa;
Aby zobaczyć zawartość obiektu, użyj var_dump() :
Var_dump($obj);
Możesz przetestować cały proces, kopiując cały kod do pliku test.php:
Załaduj stronę do przeglądarki, a na ekranie powinien pojawić się następujący wiersz:
Obiekt(MojaKlasa)#1 (0) ( )
Właśnie stworzyłeś swój pierwszy skrypt OOP.
Właściwości lub zmienne klasy służą do dodawania danych do klasy. Właściwości działają jak zwykłe zmienne, ale są powiązane z obiektem i można uzyskać do nich dostęp tylko za pomocą obiektu.
Aby dodać właściwości do klasy MyClass, użyj tego kodu w swoim skrypcie:
Słowo kluczowe public określa widoczność właściwości, co omówimy w dalszej części tego rozdziału. Właściwość jest następnie nazywana przy użyciu normalnej składni zmiennej i przypisywana jest jej wartość (chociaż właściwość klasy nie musi być inicjowana).
Echo $obj->prop1;
Ponieważ może istnieć wiele implementacji klasy bez odniesienia do konkretnego obiektu, właściwości nie można odczytać, ponieważ skrypt nie może określić, z którego obiektu ma zostać odczytany. Strzałka (->) to konstrukcja OOP używana do uzyskiwania dostępu do właściwości i metod danego obiektu.
Zmodyfikuj skrypt w test.php, aby odczytał wartość właściwości zamiast wyświetlać informacje o całej klasie:
prop1; // Wyświetlić właściwość?>
Odśwież stronę w przeglądarce, aby zobaczyć wynik działania skryptu:
Własność klasy
Metoda jest funkcją klasy. Pojedyncza akcja, którą może wykonać obiekt, jest zdefiniowana w klasie jako metoda.
Na przykład utwórzmy metody, które ustawiają i odczytują wartość właściwości $prop1:
prop1 = $nowa wartość;
) funkcja publiczna getProperty() (zwróć $this->prop1. "
"; ) ) $obj = nowa MojaKlasa; echo $obj->prop1; ?> Notatka
- OOP pozwala obiektowi odnosić się do siebie za pomocą $this . Podczas pracy wewnątrz metody użycie $this pozwala na użycie nazwy obiektu poza klasą.
prop1 = $nowa wartość;
"; ) ) $obj = new MyClass; echo $obj->getProperty(); // pobierz wartość właściwości $obj->setProperty("Nowa właściwość."); // Ustaw nową wartość echo $obj->getProperty () ; // Przeczytaj wartość ponownie, aby zobaczyć zmiany?>
Odświeżamy stronę w przeglądarce i widzimy:
Właściwość klasy Nowa właściwość
Korzyści z OOP pojawiają się w przypadku używania wielu obiektów tej samej klasy.
prop1 = $nowa wartość;
"; ) ) // Utwórz dwa obiekty $obj = new MyClass; $obj2 = new MyClass; // Pobierz wartości $prop1 z obu obiektów echo $obj->getProperty(); echo $obj2->getProperty( ); // Ustaw nowe wartości właściwości dla obu obiektów $obj->setProperty("Nowa wartość właściwości"); $obj2->setProperty("Właściwość należy do drugiego obiektu"); // Wydrukuj wartości $prop1 dla obu echo $obj->getProperty() ; echo $obj2->getProperty();
Po załadowaniu strony do przeglądarki zobaczysz następujące informacje:
Właściwość klasy Właściwość klasy Nowa wartość właściwości Właściwość należy do drugiego obiektu
Uwaga OOP przechowuje obiekty jako różne byty, co ułatwia rozdzielenie kodu na różne małe i połączone ze sobą części.
Aby ułatwić korzystanie z obiektów, PHP ma ich kilka metody magiczne. Są to specjalne metody wywoływane, gdy na obiekcie wykonywane są określone akcje. W ten sposób programista może stosunkowo łatwo wykonać kilka typowych zadań.
Kiedy obiekt jest tworzony, często konieczne jest natychmiastowe ustawienie pewnych właściwości. Aby wykonać takie zadania, PHP posiada magiczną metodę __construct(), która jest wywoływana automatycznie podczas tworzenia nowego obiektu.
Aby zilustrować tę koncepcję, dodajmy konstruktor do klasy MyClass. Wydrukuje komunikat po utworzeniu nowego obiektu klasy:
"; ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) funkcja publiczna getProperty() ( return $this->prop1 . "
"; ) ) // Utwórz nowy obiekt $obj = new MyClass; // Pobierz wartość właściwości $prop1 echo $obj->
";
?>
"; ) ) $obj = nowa MojaKlasa; echo $obj->prop1; ?>— stała __CLASS__ zwraca nazwę klasy, w której jest wywoływana; jest to jedna z magicznych stałych PHP.
Utworzono obiekt klasy „MyClass”! Koniec właściwości klasy pliku.
Aby wywołać funkcję podczas usuwania obiektu, użyj magicznej metody __destruct(). Jest to bardzo przydatna metoda prawidłowego czyszczenia właściwości klasy (na przykład poprawnego zamknięcia połączenia z bazą danych).
Gdy obiekt klasy zostanie usunięty magiczną metodą, wyświetlimy komunikat:
__destruct() w MyClass:
"; ) funkcja publiczna __destruct() ( echo "Obiekt klasy "", __CLASS__, "" usunięte.
"; ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) funkcja publiczna getProperty() ( return $this->prop1 . "
"; ) ) // Utwórz nowy obiekt $obj = new MyClass; // Pobierz wartość właściwości $prop1 echo $obj->getProperty(); // Wyświetl komunikat o osiągnięciu końca pliku echo "Koniec pliku.
";
?>
Odświeżamy stronę w przeglądarce i otrzymujemy wynik:
Utworzono obiekt klasy „MyClass”! Koniec właściwości klasy pliku. Obiekt klasy „MyClass” został usunięty.
Po osiągnięciu końca pliku PHP automatycznie zwalnia wszystkie zasoby.
Aby jawnie wywołać destruktor i usunąć obiekt, możesz użyć funkcji unset():
"; ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) funkcja publiczna getProperty() ( return $this->prop1 . "
"; ) ) // Utwórz nowy obiekt $obj = new MyClass; // Pobierz wartość właściwości $prop1 echo $obj->getProperty(); // Usuń obiekt unset($obj); // Wyświetl komunikat o osiągnięciu końca pliku echo "Koniec pliku.
";
?>
Teraz wynik kodu będzie wyglądał tak po załadowaniu do przeglądarki:
Utworzono obiekt klasy „MyClass”! Właściwość klasy Obiekt klasy „MyClass” został usunięty. Koniec pliku.
Aby uniknąć błędu, jeśli skrypt spróbuje wypisać MyClass jako ciąg znaków, używana jest inna magiczna metoda, __toString() .
Bez użycia __toString() próba wygenerowania obiektu jako ciągu znaków zakończy się błędem krytycznym. Spróbuj użyć funkcji echa, aby wyświetlić obiekt bez użycia magii:
"; ) funkcja publiczna __destruct() ( echo "Obiekt klasy "", __CLASS__, "" usunięte.
"; ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) funkcja publiczna getProperty() ( return $this->prop1 . "
";
?>
Wynik będzie wyglądał następująco:
Utworzono obiekt klasy „MyClass”! Łagodny błąd krytyczny: Obiekt klasy MyClass nie mógł zostać przekonwertowany na ciąg znaków w /Applications/XAMPP/xamppfiles/htdocs/testing/test.php w linii 40
Aby uniknąć błędu, użyj metody __toString():
"; ) funkcja publiczna __destruct() ( echo "Obiekt klasy "", __CLASS__, "" usunięte.
"; ) funkcja publiczna __toString() ( echo "Użyj metody toString: "; return $this->getProperty(); ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) funkcja publiczna getProperty( ) (zwróć $this->prop1. "
"; ) ) // Utwórz nowy obiekt $obj = new MyClass; // Wyprowadź obiekt jako echo $obj; // Usuń obiekt unset($obj); // Wyprowadź komunikat o osiągnięciu końca echo pliku "Koniec pliku.
";
?>
W takim przypadku próba konwersji obiektu na ciąg znaków zakończy się wywołaniem metody getProperty(). Załaduj skrypt do przeglądarki i spójrz na wynik:
Utworzono obiekt klasy „MyClass”! Używamy metody toString: Właściwość klasy Obiekt klasy „MyClass” został usunięty. Koniec pliku.
Klasy mogą dziedziczyć metody i właściwości z innych klas za pomocą słowa kluczowego Extends. Na przykład utwórzmy drugą klasę, która rozszerza MyClass i dodaje metodę:
"; ) funkcja publiczna __destruct() ( echo "Obiekt klasy "", __CLASS__, "" usunięte.
"; ) funkcja publiczna __toString() ( echo "Użyj metody toString: "; return $this->getProperty(); ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) funkcja publiczna getProperty( ) (zwróć $this->prop1. "
"; ) ) klasa MyOtherClass rozszerza MyClass ( funkcja publiczna newMethod() ( echo "Z metody nowej klasy " . __CLASS__ .".
"; ) ) // Utwórz nowy obiekt $newobj = new MyOtherClass; // Użyj nowej metody echo $newobj->newMethod(); // Użyj metody z klasy nadrzędnej echo $newobj->getProperty(); ? >
Po załadowaniu skryptu do przeglądarki otrzymujemy wynik:
Utworzono obiekt klasy „MyClass”! Z nowej metody klasowej „MyOtherClass”. Właściwość klasy Obiekt klasy „MyClass” został usunięty.
Aby zmienić zachowanie istniejących właściwości lub metod w nowej klasie, możesz po prostu je przeciążyć, ponownie deklarując je w nowej klasie:
"; ) funkcja publiczna __destruct() ( echo "Obiekt klasy "", __CLASS__, "" usunięte.
"; ) funkcja publiczna __toString() ( echo "Użyj metody toString: "; return $this->getProperty(); ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) funkcja publiczna getProperty( ) (zwróć $this->prop1. "
"; ) ) klasa MyOtherClass rozszerza MyClass ( funkcja publiczna __construct() ( echo "Nowy konstruktor w klasie " . __CLASS__ .".
"; ) ) // Utwórz nowy obiekt $newobj = new MyOtherClass; // Wyprowadź obiekt jako ciąg znaków echo $newobj->newMethod(); // Użyj metody z klasy nadrzędnej echo $newobj->getProperty() ; ?>
Zmiany spowodują następujące wyniki podczas uruchamiania kodu:
Nowy konstruktor w klasie „MyOtherClass”. Z nowej metody klasowej „MyOtherClass”. Właściwość klasy Obiekt klasy „MyClass” został usunięty.
Aby dodać nową funkcjonalność do metody dziedziczonej, zachowując jednocześnie funkcjonalność metody oryginalnej, użyj słowa kluczowego parent with operator rozdzielczości widoczności ( :: ) :
"; ) funkcja publiczna __destruct() ( echo "Obiekt klasy "", __CLASS__, "" usunięte.
"; ) funkcja publiczna __toString() ( echo "Użyj metody toString: "; return $this->getProperty(); ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) funkcja publiczna getProperty( ) (zwróć $this->prop1. "
"; ) ) class MyOtherClass rozszerza MyClass ( funkcja publiczna __construct() ( parent::__construct(); // Wywołanie konstruktora klasy nadrzędnej echo "Nowy konstruktor w klasie " __CLASS__ .".
"; ) funkcja publiczna newMethod() ( echo "Z metody nowej klasy " . __CLASS__ . ".
"; ) ) // Utwórz nowy obiekt $newobj = new MyOtherClass; // Wyprowadź obiekt jako ciąg znaków echo $newobj->newMethod(); // Użyj metody z klasy nadrzędnej echo $newobj->getProperty() ; ?>
Powyższy kod po wykonaniu wyświetli komunikaty zarówno od konstruktorów nowej, jak i nadrzędnej klasy:
Utworzono obiekt klasy „MyClass”! Nowy konstruktor w klasie „MyOtherClass”. Z nowej metody klasowej „MyOtherClass”. Właściwość klasy Obiekt klasy „MyClass” został usunięty.
Aby uzyskać dodatkową kontrolę nad obiektami, metodami i właściwościami, ustawiany jest zakres. Kontroluje to, w jaki sposób i skąd można uzyskać dostęp do właściwości i metod. Istnieją trzy słowa kluczowe do ustawiania zakresu: public , chroniony i prywatny . Oprócz ustawienia zakresu, metody i właściwości można zadeklarować jako static , umożliwiając dostęp do nich bez konieczności implementowania klasy.
"; ) ) $obj = nowa MojaKlasa; echo $obj->prop1; ?>- Zakres to nowa właściwość wprowadzona w PHP 5. Informacje o zgodności OOP z PHP 4 można znaleźć w podręczniku PHP.
Wszystkie właściwości i metody użyte wcześniej w tym artykule były publiczne. Oznacza to, że można było uzyskać do nich dostęp w dowolnym miejscu, zarówno w klasie, jak i poza nią.
Kiedy właściwość lub metoda jest zadeklarowana z chronioną dyrektywą, można uzyskać do niego dostęp tylko w samej klasie lub w klasach pochodnych(klasy rozszerzające klasę bazową zawierającą metodę z dyrektywą chroniony).
Zadeklarujmy metodę getProperty() jako chroniony w MyClass i spróbuj uzyskać do niego dostęp poza klasą:
"; ) funkcja publiczna __destruct() ( echo "Obiekt klasy "", __CLASS__, "" usunięte.
"; ) funkcja publiczna __toString() ( echo "Użyj metody toString: "; return $this->getProperty(); ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) chroniona funkcja getProperty( ) (zwróć $this->prop1. "
"; ) funkcja publiczna newMethod() ( echo "Z metody nowej klasy " . __CLASS__ . ".
"; ) ) // Utwórz nowy obiekt $newobj = new MyOtherClass; // Spróbuj wywołać chronioną metodę echo $newobj->getProperty(); ?>
Podczas próby wykonania skryptu zostanie wygenerowany następujący błąd:
Utworzono obiekt klasy „MyClass”! Nowy konstruktor w klasie „MyOtherClass”. Błąd krytyczny: wywołanie chronionej metody MyClass::getProperty() z kontekstu „” w /Applications/XAMPP/xamppfiles/htdocs/testing/test.php w linii 55
Utwórzmy teraz nową metodę w MyOtherClass, aby wywołać metodę getProperty():
"; ) funkcja publiczna __destruct() ( echo "Obiekt klasy "", __CLASS__, "" usunięte.
"; ) funkcja publiczna __toString() ( echo "Użyj metody toString: "; return $this->getProperty(); ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) chroniona funkcja getProperty( ) (zwróć $this->prop1. "
"; ) ) klasa MyOtherClass rozszerza MyClass ( funkcja publiczna __construct() ( parent::__construct(); echo "Nowy konstruktor w klasie " __CLASS__ .".
"; ) funkcja publiczna newMethod() ( echo "Z metody nowej klasy " . __CLASS__ . ".
"; ) funkcja publiczna callProtected() ( return $this->getProperty(); ) ) // Utwórz nowy obiekt $newobj = new MyOtherClass; // Wywołaj chronioną metodę z metody publicznej echo $newobj->callProtected() ; ?>
Po uruchomieniu skryptu wynik będzie następujący:
Utworzono obiekt klasy „MyClass”! Nowy konstruktor w klasie „MyOtherClass”. Właściwość klasy Obiekt klasy „MyClass” został usunięty.
Dostępne są właściwości i metody zadeklarowane jako prywatne tylko w klasie, w której są zdefiniowane. To oznacza, że nawet jeśli nowa klasa wywodzi się z klasy definiującej prywatne właściwości i metody, nie będą one dostępne w klasie pochodnej.
Na potrzeby demonstracji zadeklarujmy metodę getProperty() jako Używając kodu, klasę można opisać w następujący sposób: klasa publiczna SomePhone ( private int rok; private String firma; public SomePhone (int rok, String firma) ( this . rok = rok; this . Company = firma; ) private void openConnection ( ) ( / /findComutator //openNewConnection... ) public void call () ( openConnection () ; System. out. println („Dzwonienie pod numer”) ; ) public void ring () ( System. out. println („Ding -ding") ; ) ) Modyfikator V MojaKlasa i spróbujmy wywołać metodę callProtected() z
MojaInnaKlasa :
"; ) funkcja publiczna __destruct() ( echo "Obiekt klasy "", __CLASS__, "" usunięte.
"; ) funkcja publiczna __toString() ( echo "Użyj metody toString: "; return $this->getProperty(); ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) funkcja prywatna getProperty( ) (zwróć $this->prop1. "
"; ) ) klasa MyOtherClass rozszerza MyClass ( funkcja publiczna __construct() ( parent::__construct(); echo "Nowy konstruktor w klasie " __CLASS__ .".
"; ) funkcja publiczna newMethod() ( echo "Z metody nowej klasy " . __CLASS__ . ".
"; ) funkcja publiczna callProtected() ( return $this->getProperty(); ) ) // Utwórz nowy obiekt $newobj = new MyOtherClass; // Użyj metody z klasy nadrzędnej echo $newobj->callProtected(); ?>
Zapisujemy skrypt, odświeżamy stronę w przeglądarce i otrzymujemy:
Utworzono obiekt klasy „MyClass”! Nowy konstruktor w klasie „MyOtherClass”. Błąd krytyczny: wywołanie metody prywatnej MyClass::getProperty() z kontekstu „MyOtherClass” w /Applications/XAMPP/xamppfiles/htdocs/testing/test.php w linii 49
Dostęp do metod i właściwości zadeklarowanych za pomocą dyrektywy statycznej można uzyskać bez inicjowania klasy. Wystarczy użyć nazwy klasy, operatora uprawnień do widoczności i nazwy właściwości lub metody.
Jedną z głównych zalet właściwości statycznych jest to, że zachowują one swoje wartości przez cały skrypt.
Aby to zademonstrować, dodajmy do klasy właściwość statyczną $count i metodę statyczną plusOne(). MojaKlasa. Następnie skonfigurujemy pętlę do...while, która będzie drukować rosnącą wartość $count, aż będzie większa niż 10:
"; ) funkcja publiczna __destruct() ( echo "Obiekt klasy "", __CLASS__, "" usunięte.
"; ) funkcja publiczna __toString() ( echo "Użyj metody toString: "; return $this->getProperty(); ) funkcja publiczna setProperty($newval) ( $this->prop1 = $newval; ) funkcja prywatna getProperty( ) (zwróć $this->prop1. "
"; ) publiczna funkcja statyczna plusOne() ( return "count = " . ++self::$count . ".
"; ) ) klasa MyOtherClass rozszerza MyClass ( funkcja publiczna __construct() ( parent::__construct(); echo "Nowy konstruktor w klasie " __CLASS__ .".
"; ) funkcja publiczna newMethod() ( echo "Z metody nowej klasy " . __CLASS__ . ".
"; ) funkcja publiczna callProtected() ( return $this->getProperty(); ) ) do ( // Wywołanie plusOne bez inicjowania klasy MyClass echo MyClass::plusOne(); ) while (MyClass::$count< 10);
?>
"; ) ) $obj = nowa MojaKlasa; echo $obj->prop1; ?>- Aby uzyskać dostęp do właściwości statycznych, musi pojawić się znak dolara ($). następuje po operatorze pozwolenia na widoczność.
Uruchomienie skryptu w przeglądarce da następujący wynik:
Liczba = 1. liczba = 2. liczba = 3. liczba = 4. liczba = 5. liczba = 6. liczba = 7. liczba = 8. liczba = 9. liczba = 10.