Úvod do objektově orientovaného programování

Úvod do objektově orientovaného programování

Objektově orientované programování je způsob, jakým lze dosáhnout výrazně přehlednějšího a znovupoužitelného kódu. OOP nám umožňuje nasimulovat realitu tak, jak ji jsme zvyklí vnímat. Můžeme tedy říci, že se odpoutáváme od toho, jak program vidí počítač (stroj) a píšeme program spíše z pohledu člověka.

Objekty v PHP

PHP již v základu poskytuje nějaké objekty, které se nám mohou hodit, například pro práci s datem a časem či pro práci s databází.

Ukážeme si jednoduchý příklad práce s objektem DateTime:

<?php

$dnes = new DateTime();

echo $dnes->format('j. n. Y');

?>

V příkladu výše nejprve pomocí klíčového slova new vytvoříme novou instanci objektu DateTime. Za názvem třídy následují závorky stejně jako při volání funkce. Tento objekt je uložený do proměnné $dnes

Následně můžeme u objektu pomocí -> přistupovat k jeho atributů (vlastnostem) a metodám. V příkladu výše přistupujme k metodě format(), která vrací textový řetězec dle předaného formátu.

Atributy (vlastnosti) objektu

Atributy objektu jsou vlastnosti neboli data, která uchovává (např. u člověka $jméno a $věk). Jedná se vpodstatě o proměnné, se kterými jsme již mnohokrát pracovali. Atribut na rozdíl od proměnných, které jsme používali dříve, patří nějakému objektu.

Metody objektu

Metody jsou schopnostmi, které umí objekt vykonávat. Například u databáze pridejZaznam() nebo vyhledej()). Jedná se funkce, které daný objekt poskytuje. Metody mohou mít parametry a mohou také vracet nějakou hodnotu. Od funkcí se liší tím, že metoda patří objektu, zatímco funkce nepatří nikam (to je také problém neobjektového kódu).

Vlastní objekty (Třídy)

Můžeme si samozřejmě vytvářet vlastní objekty. Ukážeme si to na příkladu uživatele:

<?php

class Uzivatel
{
  
}

Takto by mohl vypadat základ pro objekt uživatele, třídy je dobré ukládal do samostatných souborů a třídit do složek dle jejich účelu, o tom si povíme později. V rámci projektu budeme třídy zatím ukládat do složky Class a soubory budeme pojmenovávat na začátku vždy s velkým písmenem dle názvu třídy, v tomto případě by se tedy soubor jmenoval Uzivatel.php

Z kódu výše je snadno pochopitelné, že třídu definujeme pomocí klíčového slova Class za klterým následuje název třídy s vekým písmenem na začátku. Poté následují složené závorky do kterých se poté zapisují vlastnosti a metody této třídy. To si nyní ukážeme.

<?php

class Uzivatel
{
  public string $jmeno;

  public string $prijmeni;

  public string $email;

  private string $heslo;

  public int $vek;

  public DateTime $datumNarozeni;
}

Jednotlivé vlastnosti objektu vždy uvedeme buď slovem public nebo private, které určuje, zda k dané vlastnosti můžeme přistupovat jen uvnitř objektu (pokud je private) nebo i vně objektu (pokud je public). Ještě by jste se mohli setkat v protected, ale tím si to v rámci kurzu nebudeme komplikovat. V rámci kurzu budeme pravděpodobně stále používat pro vlastnosti pouze klíčové slovo private.

Dále poté následuje datový typ (ten nemusí být vždy pouze primitivní), například u data narození pužíváme typ DateTime. Poté už následuje za dolarem název vlastnosti, stejně jako při používaní proměnné.

Dále si ukážeme příklad metody:

<?php

class Uzivatel
{
  public string $jmeno;

  public string $prijmeni;

  public string $email;

  private string $heslo;

  public int $vek;

  public DateTime $datumNarozeni;

  public function vratJmeno(): string
  {
    return $this->jmeno;
  }

  public function vratCeleJmeno(): string
  {
    return $this->jmeno . ' ' . $this->prijmeni;
  }
}

Metody objektu vždy uvedeme opět klíčovým slovem public nebo private. U metod budeme na rozdíl od objektů naopak téměř výhradně používat pouze hodnotu public. Poté již zapíše funkci v podstatě stejně jako jme u zapisování vlastních funkcí zvyklí. Metody by samozřejmě mohly také mít parametry, stejně jako normální funkce.

Dále si všimněte, že pokud chceme přistupovat uvnitř objektu k nějaké jeho vlastnosti, použijme k tomu klíčové slovo $this následované šipkou ->.

Konsruktor

Konstruktor je speciální funkce, která se zavolá při založení nové instance dané třídy. Konstruktor může přijímat parametry jako každá jiný funkce a následně s nimi může pracovat. Parametry do konstruktoru předáme do závorek, při vytváření instance. Může to vypadat například takto:

<?php

class Uzivatel
{
  public string $jmeno;

  public string $prijmeni;

  public string $email;

  private string $heslo;

  public int $vek;

  public DateTime $datumNarozeni;

  public function __construct(string $jmenoUzivatele, string $prijmeniUzivatele)
  {
    $this->jmeno = $jmenoUzivatele;
    $this->prijmeni = $prijmeniUzivatele;
  }

  public function vratJmeno(): string
  {
    return $this->jmeno;
  }

  public function vratCeleJmeno(): string
  {
    return $this->jmeno . ' ' . $this->prijmeni;
  }
}

Pro přidání konstruktoru do naší třídy stačí vytvořit public funkci s názvem __construct. Instanci objektu By jme poté vytvořili následovně:

<?php

$uzivatel = new Uzivatel("Standa", "Kosáček");
echo $uzivatel->vratCeleJmeno();

Kód výše bude tedy fungovat tak, že do konstruktoru objektu Uzivatel předá hodnoty "Standa" a Kosáček, uvnitř konstruktoru se tyto hodnoty uloží do vlastností objektu. Následně je zavolána metoda objektu vratCeleJmeno(), která vrátí celé jméno uživatele.

Objektově orientované programování nabízí velké množství možností, ke kterým se ale v rámci kurzu nedostaneme. Pokud si budete chtít dále rozšiřovat znalosti v OOP doporučím pokračovat s tím, jak v OOP využívat dědičnost, zapouzdření, polymorfismus nebo statiku. Postupem času by jste se měli dostat do stavu, že veškerý kód, který budete psát bude objektový. Nemusíte se ale bát, že by vám to co jste se do teď naučili bylo k ničemu, všechny do teď nabyté znalosti budete v OOP dále využívat, jen se trochu liší to, jak se zapisují.