Okna.  Wirusy.  Laptopy.  Internet.  Biuro.  Narzędzia.  Kierowcy

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.

Co to jest OOP

Powstał w wyniku rozwoju programowania proceduralnego. Podstawą języków obiektowych są następujące zasady:

  • hermetyzacja;
  • dziedzictwo;
  • wielopostaciowość.

Niektóre zasady, które zostały pierwotnie określone w pierwszej OYA, uległy znaczącym zmianom.

Przykłady języków obiektowych:

  1. Pascal. Wraz z wydaniem Delphi 7, oficjalnie stało się ono znane jako Delphi. Głównym obszarem zastosowań Object Pascala jest pisanie oprogramowania aplikacyjnego.
  2. C++ jest powszechnie używany do tworzenia oprogramowania i jest jednym z najpopularniejszych języków. Służy do tworzenia systemu operacyjnego, programów użytkowych, sterowników urządzeń, aplikacji, serwerów, gier.
  3. Java - przetłumaczona na kod bajtowy, przetwarzana przez wirtualną maszynę Java. Zaletą tej metody wykonania jest jej niezależność od systemu operacyjnego i sprzętu. Istniejące rodziny: Standard Edition, Enterprise Edition, Micro Edition, Card.
  4. JavaScript jest używany jako język skryptowy dla stron internetowych. Składnia jest bardzo podobna do C i Java. Jest implementacją Ecmascript. Sam Ecmascript służy jako podstawa do budowania innych, takich jak JScript, ActionScript.
  5. Objective-C jest zbudowany na języku C, a sam kod C jest zrozumiały dla kompilatora Objective-C.
  6. Perl jest językiem wysokiego poziomu, interpretowanym, dynamicznym i uniwersalnym. Posiada bogate możliwości pracy z tekstem i został pierwotnie zaprojektowany specjalnie do manipulacji tekstem. Obecnie stosowany w administrowaniu systemami, rozwoju, programowaniu sieci, bioinformatyce itp.
  7. PHP. Skrót można przetłumaczyć jako preprocesor hipertekstu. Służy do tworzenia aplikacji internetowych, w szczególności części serwerowej. Za jego pomocą można tworzyć aplikacje gui korzystając z pakietów WinBinder.
  8. Python to język ogólnego przeznaczenia, którego celem jest poprawa produktywności programistów i czytelności kodu. Powstał projekt Cython, za pomocą którego programy napisane w Pythonie są tłumaczone na kod w języku C.

Abstrakcja

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.

Dziedzictwo

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:

  • prosty;
  • mnogi.

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

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.

Wielopostaciowość

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 funkcji i metod;
  • odlewanie typu.

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

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:

  • dziedzictwo;
  • wspomnienia;
  • zbiór.

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ąć.

Funkcje implementacyjne

W centrum języków obiektowych znajduje się obiekt, będący częścią klasy. Składa się z:

  • pola;
  • metoda.

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.

Metodyki OOP

Istnieją następujące metodologie:

  • Programowanie zorientowane komponentowo;
  • Programowanie prototypów;
  • Programowanie zorientowane klasowo.

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:

  • potomkowie nie powinni zachowywać strukturalnego podobieństwa do prototypu (w relacji klasa-instancja dokładnie tak się dzieje);
  • podczas kopiowania prototypu wszystkie metody są dziedziczone jeden do jednego.

Programowanie zorientowane klasowo koncentruje się na instancji. Klasa definiuje wspólną strukturę i zachowanie instancji, które ją przyjmują.

Języki obiektowe

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:

  • deklaracja klas z polami, metodami;
  • rozszerzanie poprzez dziedziczenie funkcji;
  • zachowanie polimorficzne.

Oprócz powyższej listy można dodać dodatkowe narzędzia:

  • konstruktor, destruktor, finalizatory;
  • właściwości;
  • indeksatory;
  • modyfikatory dostępu.

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.

Podstawowe pojęcia programowania obiektowego

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

  • hermetyzacja;
  • dziedzictwo;
  • wielopostaciowość.

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ę.

Co to jest przedmiot?

Świat, w którym żyjemy, składa się z przedmiotów. Jeśli się rozejrzymy, zobaczymy, że otaczają nas domy, drzewa, samochody, meble, naczynia, komputery. Wszystkie te przedmioty są przedmiotami i każdy z nich ma zestaw specyficznych cech, zachowań i przeznaczenia. Jesteśmy przyzwyczajeni do przedmiotów i zawsze używamy ich do bardzo konkretnych celów. Na przykład, jeśli musimy dojechać do pracy, korzystamy z samochodu, jeśli chcemy zjeść, korzystamy z naczyń, a jeśli potrzebujemy odpocząć, potrzebujemy wygodnej sofy. Osoba jest przyzwyczajona do obiektywnego myślenia w celu rozwiązywania problemów w życiu codziennym. Był to jeden z powodów wykorzystywania obiektów w programowaniu i takie podejście do tworzenia programów nazwano obiektowym. Podajmy przykład. Wyobraź sobie, że opracowałeś nowy model telefonu i chcesz uruchomić jego masową produkcję. Jako projektant telefonu wiesz do czego on służy, jak będzie działał i z jakich części będzie się składał (etui, mikrofon, głośnik, przewody, przyciski itp.). Jednak tylko Ty wiesz, jak połączyć te części. Nie planujesz jednak produkować telefonów osobiście; do tego masz całą kadrę pracowników. Żeby nie trzeba było za każdym razem tłumaczyć jak połączyć części telefonu i aby wszystkie telefony w trakcie produkcji wyszły takie same, przed rozpoczęciem ich produkcji konieczne będzie wykonanie rysunku w formie opis budowy telefonu. Klasa to opis obiektu, który nie został jeszcze utworzony, czyli ogólny szablon składający się z pól, metod i konstruktora, a obiekt to instancja klasy utworzonej na podstawie tego opisu.

Abstrakcja

Zastanówmy się teraz, jak przenieść się z obiektu w świecie rzeczywistym do obiektu w programie na przykładzie telefonu. Historia tego środka komunikacji przekracza 100 lat, a współczesny telefon, w przeciwieństwie do swojego XIX-wiecznego poprzednika, jest urządzeniem znacznie bardziej skomplikowanym. Używając telefonu, nie myślimy o jego budowie i procesach zachodzących w jego wnętrzu. Po prostu korzystamy z funkcji udostępnionych przez twórców telefonu – przycisków czy ekranu dotykowego do wybierania numeru i wykonywania połączeń. Jednym z pierwszych interfejsów telefonicznych było pokrętło, które obracało się, aby wykonać połączenie. Oczywiście nie było to zbyt wygodne. Mimo to klamka spełniła swoją funkcję prawidłowo. Patrząc na najnowocześniejszy i pierwszy telefon, od razu można rozpoznać najważniejsze szczegóły, istotne zarówno w przypadku urządzenia z końca XIX wieku, jak i ultranowoczesnego smartfona. Oznacza to wykonywanie połączenia (wybieranie numeru) i odbieranie połączenia. Zasadniczo to właśnie sprawia, że ​​telefon jest telefonem, a nie czymś innym. Teraz zastosowaliśmy zasadę w OOP - podkreślanie najważniejszych cech i informacji o obiekcie. Zasada ta nazywa się abstrakcją. Abstrakcję w OOP można również zdefiniować jako sposób reprezentowania elementów rzeczywistego problemu jako obiektów w programie. Abstrakcja zawsze wiąże się z uogólnieniem niektórych informacji o właściwościach obiektów lub obiektów, dlatego najważniejsze jest oddzielenie istotnych informacji od nieistotnych informacji w kontekście rozwiązywanego problemu. W tym przypadku może być kilka poziomów abstrakcji. Spróbujmy zastosować zasadę abstrakcji do naszych telefonów. Najpierw wyróżnijmy najpopularniejsze typy telefonów od samego początku do dnia dzisiejszego. Można je na przykład przedstawić w formie diagramu pokazanego na rysunku 1. Teraz, korzystając z abstrakcji, możemy wyróżnić informacje ogólne w tej hierarchii obiektów: powszechny abstrakcyjny typ obiektów - telefon, ogólna charakterystyka telefonu - rok powstania i wspólny interfejs - wszystkie telefony mają możliwość odbierania i wysyłania połączeń. Oto jak to wygląda w Javie: publiczna klasa abstrakcyjna AbstractPhone ( prywatna int rok; public AbstractPhone (int rok) ( this . rok = rok; ) publiczna abstrakcja void call (int wynikNumber) ; publiczna abstrakcja void ring (int inputNumber) ; ) Na podstawie tej klasy abstrakcyjnej będziemy mogli tworzyć w programie nowe typy telefonów, korzystając z innych podstawowych zasad Java OOP, które omówimy poniżej.

Hermetyzacja

Używając abstrakcje podkreślamy ogólny dla wszystkich obiektów. Każdy model telefonu jest jednak indywidualny i nieco różni się od pozostałych. Jak wyznaczyć granice w programie i wyznaczyć tę indywidualność? Jak możemy mieć pewność, że nikt z użytkowników nie zepsuje nam przypadkowo lub celowo telefonu lub nie będzie próbował przerabiać jednego modelu na inny? W świecie realnych obiektów odpowiedź jest oczywista: wszystkie części trzeba włożyć do obudowy telefonu. Przecież jeśli tego nie zrobimy i pozostawimy całe wnętrze telefonu oraz łączące je przewody na zewnątrz, na pewno znajdzie się dociekliwy eksperymentator, który będzie chciał „poprawić” działanie naszego telefonu. Aby uniknąć takiej ingerencji w projekt i działanie obiektu, OOP wykorzystuje zasadę enkapsulacji - kolejną podstawową zasadę OOP, w której atrybuty i zachowanie obiektu są łączone w jedną klasę, wewnętrzna implementacja obiektu jest ukryta przed użytkownika oraz otwarty interfejs do pracy z obiektem. Zadaniem programisty jest określenie, które atrybuty i metody będą publicznie dostępne, a które stanowią wewnętrzne implementacje obiektu i nie powinny być modyfikowane.

Hermetyzacja i kontrola dostępu

Załóżmy, że podczas produkcji na tylnej części telefonu wygrawerowana jest informacja o nim: rok produkcji lub logo firmy producenta. Ta informacja dość specyficznie charakteryzuje ten model - jego stan. Można powiedzieć, że twórca telefonu zadbał o niezmienność tej informacji – mało prawdopodobne, aby komukolwiek przyszło do głowy usunięcie graweru. W świecie Java stan przyszłych obiektów opisywany jest w klasie za pomocą pól, a ich zachowanie za pomocą metod. Możliwość zmiany stanu i zachowania realizowana jest za pomocą modyfikatorów dostępu do pól i metod - prywatny, chroniony, publiczny , a także domyślny (dostęp domyślny). Przykładowo uznaliśmy, że rok powstania, nazwa producenta telefonu i jedna z metod należą do wewnętrznej implementacji klasy i nie mogą być zmieniane przez inne obiekty w programie. 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 prywatny 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 sprawia, że ​​pola i metody klasy są dostępne tylko w obrębie tej klasy. Oznacza to, że możesz uzyskać dostęp 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 pól z zewnątrz jest niemożliwe, tak samo jak nie ma jak zadzwonić metody. Ukrycie dostępu do metody openConnection pozostawia nam również swobodę zmiany wewnętrznej implementacji tej metody, ponieważ gwarantujemy, że metoda ta nie będzie używana przez inne obiekty i nie zakłóci ich pracy. Aby pracować z naszym obiektem, metody call i ring pozostawiamy otwarte za pomocą modyfikatora . publiczny

Dziedzictwo

Spójrzmy jeszcze raz na tabelę telefonów. Widać, że reprezentuje on hierarchię, w której model znajdujący się poniżej posiada wszystkie cechy modeli znajdujących się wyżej w gałęzi, plus własną. Przykładowo smartfon do komunikacji wykorzystuje sieć komórkową (ma właściwości telefonu komórkowego), jest bezprzewodowy i przenośny (ma właściwości telefonu bezprzewodowego), może odbierać i wykonywać połączenia (ma właściwości telefonu). W tym przypadku możemy mówić o dziedziczeniu właściwości obiektu. W programowaniu dziedziczenie polega na wykorzystaniu istniejących klas do zdefiniowania nowych. Spójrzmy na przykład tworzenia klasy smartfona za pomocą dziedziczenia. Wszystkie telefony bezprzewodowe zasilane są akumulatorami, których czas pracy jest określony w godzinach. Dodajmy więc tę właściwość do klasy telefonu bezprzewodowego: publiczna klasa abstrakcyjna WirelessPhone rozszerza AbstractPhone ( private int hour; public WirelessPhone (int rok, int godzina) ( super (rok) ; this .hour = godzina; ) ) Telefony komórkowe dziedziczą właściwości telefonu bezprzewodowego. Do tej klasy dodaliśmy także implementację metod wywoływania i dzwonienia: klasa publiczna CellPhone rozszerza WirelessPhone ( public CellPhone (int rok, int godzina) ( super (rok, godzina); ) @Override public void call ( int numer wyjściowy) ( System. out. println („Numer dzwoniący” + numer wyjściowy) ; @Override public void ring (int inputNumber) ( System. out. println ( „Dzwoni do ciebie abonent”+ numer wejściowy) ;

Wielopostaciowość

Jeśli przyjrzymy się wszystkim modelom telefonów, to pomimo różnic w wyglądzie i konstrukcji modeli, możemy zidentyfikować w nich pewne wspólne zachowania – wszystkie potrafią odbierać i wykonywać połączenia oraz mają dość przejrzysty i prosty zestaw przycisków sterujących. Stosując jedną z podstawowych zasad OOP, która jest nam już znana, abstrakcję w ujęciu programistycznym, możemy powiedzieć, że obiekt telefonu ma jeden wspólny interfejs. Dlatego użytkownicy telefonów mogą w miarę wygodnie korzystać z różnych modeli, korzystając z tych samych przycisków sterujących (mechanicznych lub dotykowych), bez wchodzenia w szczegóły techniczne urządzenia. Tak więc stale korzystasz z telefonu komórkowego i możesz łatwo wykonywać połączenia z jego odpowiednika w telefonie stacjonarnym. Zasada obowiązująca w OOP, gdy program może używać obiektów z tym samym interfejsem bez informacji o wewnętrznej strukturze obiektu, nazywa się wielopostaciowość . Wyobraźmy sobie, że w naszym programie musimy opisać użytkownika, który za pomocą dowolnego modelu telefonu może zadzwonić do innego użytkownika. Oto jak możesz to zrobić: klasa publiczna User ( private String name; public User (String name) ( this . name = name; ) public void callAnotherUser (int numer, telefon AbstractPhone) ( // to jest polimorfizm - użycie w kodzie telefonu typu abstrakcyjnego AbstractPhone! telefon. zadzwoń (numer) ; ) ) ) Teraz opiszemy różne modele telefonów. Jeden z pierwszych modeli telefonów: publiczna klasa ThomasEdisonPhone rozszerza AbstractPhone ( public ThomasEdisonPhone (int rok) ( super (rok) ; ) @Override public void call (int OutputNumber) ( System. out. println („Obróć pokrętło” ) ; System .wydrukuj(„Proszę podać numer telefonu, proszę pana” ) ;+ numer wyjściowy); ) @Override public void ring (int inputNumber) ( System. out. println („Masz przychodzącą rozmowę wideo…” + numer wejściowy) ; ) ) Stwórzmy obiekty w metodzie main() i przetestujmy metodę callAnotherUser: AbstractPhone FirstPhone = new ThomasEdisonPhone (1879) ; Telefon AbstractPhone = nowy telefon (1984); Wideotelefon Abstrakcyjny= nowy Wideotelefon (2018); Użytkownik użytkownik = nowy użytkownik („Andrey” ); użytkownik. callAnotherUser(224466, pierwszyTelefon);// Obróć pokrętło //Proszę podać numer abonenta, proszę pana użytkownik. callAnotherUser(224466, telefon);
  • //Dzwoń pod numer 224466
  • użytkownik. callAnotherUser(224466, wideotelefon);
  • //Podłączanie kanału wideo dla abonenta 224466
  • Wywołując tę ​​samą metodę na obiekcie użytkownika, otrzymaliśmy różne wyniki. Konkretna implementacja metody wywołania w ramach metody callAnotherUser została wybrana dynamicznie na podstawie konkretnego typu obiektu wywołującego podczas wykonywania programu. To jest główna zaleta polimorfizmu – wybór implementacji podczas wykonywania programu. W powyższych przykładach klasy telefonu zastosowaliśmy nadpisywanie metod, czyli technikę zmieniającą implementację metody zdefiniowaną w klasie bazowej bez zmiany sygnatury metody. Zasadniczo jest to zastąpienie metody i to nowa metoda zdefiniowana w podklasie jest wywoływana podczas działania programu. Zazwyczaj podczas zastępowania metody używana jest adnotacja @Override, która zachęca kompilator do sprawdzenia podpisów metod przesłanianych i przesłaniających.
W końcu

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;

używać typów abstrakcyjnych do opisywania 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.

Czym są obiekty i klasy

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.

Jaka jest różnica pomiędzy klasami i obiektami

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.

Struktura klas

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.

Definiowanie właściwości klas

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

Definiowanie metod klas

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.

Magiczne metody w OOP

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ń.

Używanie konstruktorów i destruktorów

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.

Konwertuj na ciąg

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.

Korzystanie z dziedziczenia klas

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.

Przeciążanie dziedziczonych właściwości i metod

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.

Zachowanie oryginalnej funkcjonalności podczas przeciążania metod

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.

Definiowanie zakresu właściwości i metod

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.

Właściwości i metody publiczne (ogólne)

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ą.

Metody i właściwości chronione

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.

Metody i właściwości prywatne

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

Metody i właściwości statyczne (statyczne)

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.



Jeśli zauważysz błąd, zaznacz fragment tekstu i naciśnij Ctrl+Enter
UDZIAŁ: