Nevím, jestli to bude nejjednodušší příklad, ale zkus si představit toto:
V republice je "X" veřejných knihoven v "Y" městech. Každá veřejná knihovna (budova) má "M" knihoven (skříní), které mají "N" polic a v každé polici je "P" knih. Každá z knih má "A" stránek, je v nich "B" odstavců, dále "C" různých slov....
Z reálného světa určitě odvodíš, jaké vlastnosti objekty mají (barva, velikost, váha,...) i co vše se dá s každým z těchto objektů dělat (metody tříd). Lze například přenést knihu ze skříně do skříně, do jiné budovy, do jiného města. Kniha se dá ztratit, dá se prodat, znehodnotit. Také se mohou měnit počty skříní v budovách, nebo knih v knihovnách. Knihy se také půjčují a je třeba například evidence výpůjček, atd..
V procedurálním PHP si asi dokážeš představit, kolik funkcí a proměnných budeš muset obstarat, na co vše budeš muset myslet a pamatovat pro další vývoj, nebo co vše tě čeká, když se změní některý z objektů či jejich funkcí (a to jde o docela jednoduchý příklad struktury).
Třeba bude nutné přidat evidenci, které konkrétní a kolik stránek vytrhnul čtenář při vypůjčení - jak vysoké je poškození knihy. Nebo přijde požadavek na přidání čárového kódu ke každé knize, či skříni. Také by bylo potřeba udělat několik pohledů na tu strukturu (různé výpisy knihoven, knih, výpůjček, prodlení při vrácení, samozřejmě seznamy autorů a jejich knih atd.). Pomocí pouhých funkcí je to dost morbidní představa.
Reálný svět je mnohem komplikovanější a už na takto jednoduchém příkladu je vidět, o co složitější je naprogramovat to v procedurálním PHP pomocí funkcí oproti OOP PHP.
V OOP PHP lze definovat tyto třídy (zjednodušeně) a pracovat s nimi bez další znalosti jejich vnitřní funkcionality či struktury:
class mesto {}
class budova {}
class knihovna {}
class kniha {}
class strana {}
class odstavec {}
class slovo {}
class vypujcka {}
...
Načrtnu hodně zjenodušené použití u kterého snad bude vidět rozdíl mezi klasickým PHP a OOP PHP:
knihovna = new knihovna();
kniha = new kniha();
if (knihovna->pocetVolnychPolic() > 0) {
police = knihovna->prvniVolnaPolice();
knihovna->pridejKnihuDoPolice(kniha, police);
}
Hlavní praktickou výhodou OPP při programování (reálném psaní kódu) oproti procedurálnímu PHP je v tom, že nemusíš v hlavě uchovávat mraky všech proměnných, ale pracuješ s instancemi tří (objekty) které zapouzdří ostatní věci. Pokud přijdou další požadavky na rozšíření objektů, nebo jejich funkcí, pak stačí změnit/rozšířit definici třídy bez znalosti ostatních objektů (pokud se jich změna přirozeně netýká). Nebo v případě požadavku na jiné vykreslení části struktury není potřeba psát hromady nových funkcí určených výhradně pro daný případ.
Je to delší čtení (pardon), ale snad je na tom i vidět, jak zásadní rozdíl by byl při psaní a rozvoji daného kódu v procedurálním PHP, oproti OOP PHP.
Pro komplexnější struktury určitě OOP doporučuju.
8. 10. 2019 00:06:40