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

Základní tabulka používaných pojmů v OOP v jazyce PHP

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

Co je to OOP třída - class

Tří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í:

Ukázka 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.";
	}
}

Ukázka využití práce s instancí třídy 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>

Konstruktor - constructor hlavní method uvnitř class

constructor 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>

Další části, které je nutné znát

🚧 Dědičnost OOP v PHP