Objektově orientované programovací jazyky jsou mocným nástrojem, který vývojářům umožňuje vytvářet aplikace modelované podle reálných objektů (věcí co známe z reálného světa). Pomocí objektů (object), tříd (class) a datových struktur (int, bool, string, double, …) mohou vývojáři vytvářet robustní, efektivní a praktické aplikace. Vývojáři mohou vytvářet opakovaně použitelné a přizpůsobitelné programy pomocí nejlepších objektově orientovaných programovacích jazyků, jako jsou Java, C++ a Python. Pomocí těchto jazyků mohou vývojáři vytvářet svižnější a interaktivnější aplikace, které uživatelům umožňují příjemnější a produktivnější práci. Dalšími oblíbenými jazyky OOP jsou Ruby, C#, PHP, TypeScript a další.
OOP zjednodušuje vazby a závislosti proměnných a funkcí, které by byly roztříštěné uvnitř souborů do tříd, které “zapouzdří” ony funkce a proměnné a jsou vázány pouze k této třídě. Lze si to představit tak, že třída = předpis objektu reálného světa, například auto. Auto má vlastnosti a metody (proměnné a funkce). Proměnnou auta může být například weight, color, engine a funkcí například startEngine(), stopEngine(), turnRight() a podobně. Fantazii se zde meze nekladou, jen je nutné rozlišovat co je ona proměnná (vlastnost) a co je funkce (akce).
| funkcionální/procedurální | OOP | Vysvětlení |
|---|---|---|
function |
method |
Funkce uvnitř class |
variable |
property/prop/attribut |
Proměnná uvnitř class (jinak řečeno vlastnosti) |
| - | class |
Předpis jak má vypadat object, který se bude vytvářet v instanci |
| - | object |
Vytvořený objekt pomocí instance z class |
| - | instance | Proces vytvoření object z class |
| - | $this |
Odkaz na class ve které aktuálně píšeme kód. |
| - | new |
Vytvoření instance |
| - | constructor() |
První method, která se volá při vytvoření instance |
| - | desctructor() |
method, která se volá při odebírání/ničení objektu. Při jeho zániku. |
| - | dědičnost | Možnost dědit property a method z jedné třídy do druhé. |
| - | public, protected, private |
Dodatečné označení property a method v rámci “zapozdření” a dedičnosti. |
| - | abstract |
Jedná se o abstraktní část, tedy nejčastěji class nebo jiní property a method, která/é musí být definována později (po dědění), nebo je určena pouze pro dědění (třeba abstract class). |
| - | interface |
Něco jako definice, jak má vypadat obsah class. Například jak bude vypadat method, co bude přijímat a co vracet. Většinou nelze definovat těla. |
| - | type |
Možnost definování vlastního datového typu. (Záleží na jazyku) |
| - | implements |
Používá se při implementaci interface do dané class |
| - | extends |
Používá se při implementaci dědičnosti class do druhé class |
| - | trait |
Možnost “jakési” vícenásobného rozšíření již existující třídy o nové property a method-. |
classTřída, neboli class je základem OOP. Třídu lze označit za předpis objektu z reálného světa nebo našeho co si vymyslíme. Ze třídy následně vzniká object, který vytvoříme skrze klíčové slovo new, tedy vytvoříme instanci třídy.
<aside> 📌
class může obsahovat následující:
methods - metody/property/prop/attribut - atributy/vlastnosti/class znázorňující velmi primitivního psa<?php
class Dog {
// ukázka property
public string $name = "Hafík";
// ukázka metody
// vypisuje co ji zadáme, proto je void
// využívá property ze třídy skrze $this
function bark(): void {
// použití další logiky, funkce, procedury, metody, property, ...
echo "Pes " . $this->name . " štěkl.";
}
}
Dog<?php
// tato třída je definovaná výše v Ukázka class znázorňující velmi primitivního psa
class Dog { ... } // ... značí zminimalizovaný obsah třídy
// někde následně v kódu programu
$dogAlpha = new Dog(); // vytvoření instance objektu z třídy Dog
$dogHafik = new Dog(); // vytvoření instance objektu z třídy Dog
dogHafik->bark(); // vypíše: Pes Hafík štěkl. - pozor jde o objekt v dogHafik!
dogAlpha->bark(); // vypíše: Pes Hafík štěkl. - pozor jde o objekt v dogAlpha!
dogAlpha->name = "Alpha"; // přejmenování psa z Hafík na Alpha - pozor jde o objekt v dogAlpha!
dogHafik->bark(); // vypíše: Pes Hafík štěkl. - pozor jde o objekt v dogHafik!
dogAlpha->bark(); // vypíše: Pes Alpha štěkl. - pozor jde o objekt v dogAlpha!
<aside> ☝ Díky tomuto efektu, můžeme z venku třídy ovlivnit vše co dělají již zapsané metody uvnitř třídy. Tomuto efektu se říká Side Effect!
</aside>
constructor hlavní method uvnitř classconstructor je “hlavní metodou” class, která nemusí být definovaná. Pokud ji však definujeme, jedná se o první bod, kde dokážeme nastavit části naší třídy, tedy například všechny property.
<?php
class Dog {
// ukázka property
public string $name = "Hafík";
// definice konstruktoru pri příjem jména
public function __construct(string $name) {
$this->name = $name;
}
// ukázka metody
// vypisuje co ji zadáme, proto je void
// využívá property ze třídy skrze $this
function bark(): void {
// použití další logiky, funkce, procedury, metody, property, ...
echo "Pes " . $this->name . " štěkl.";
}
}
Tato třída je naprosto stejná s původní třídou Dog, má ale jeden zásadní rozdíl. Nově musíme při volání konstruktoru předat parametr name, jinak nepůjde vytvořit instance a tedy objekt nevznikne a program spadne.
<?php
// tato třída je definovaná výše v Konstruktor - znázorňující velmi primitivního psa s konstruktorem
class Dog { ... } // ... značí zminimalizovaný obsah třídy
// někde následně v kódu programu
$dogAlpha = new Dog("Alpha"); // vytvoření instance objektu z třídy Dog
$dogHafik = new Dog("Hafík"); // vytvoření instance objektu z třídy Dog
dogHafik->bark(); // vypíše: Pes Hafík štěkl. - pozor jde o objekt v dogHafik!
dogAlpha->bark(); // vypíše: Pes Alpha štěkl. - pozor jde o objekt v dogAlpha!
dogAlpha->name = "Beta"; // přejmenování psa z Alpha na Beta - pozor jde o objekt v dogAlpha!
dogHafik->bark(); // vypíše: Pes Hafík štěkl. - pozor jde o objekt v dogHafik!
dogAlpha->bark(); // vypíše: Pes Alpha štěkl. - pozor jde o objekt v dogAlpha!
Tento kód nám ukazuje, že constructor je využíván právě jako závorky za názvem třídy. Implementačně se může lišit v různých jazycích.
<?php
$dogAlpha = new Dog();
// toto nebude fungovat, jelikož chceme minimálně 1 parametr
<aside>
☝ Pokud náš constructor vyžaduje minimálně jeden parametr a to name, není možné toto použít, jelikož kód neví, co za ono name dosadit. Proto kód spadne a nebude vykonán.
</aside>