Autor Zpráva
jefitto44
Profil
Zdravím, začal som niečo študovať ohľadom OOP v PHP a narazil som na problémy, ktorým nerozumiem... konkrétne sa jedná o objekty? Metódy? Ani neviem, ako sa to volá.
Chcel by som si ujasniť základné veci (som začiatočník, prosím, nesmejte sa, aj vy ste raz začínali) ohľadom toho... takže majme vzorové objekty Clovek a Auto

To znamená, že potrebujem class.Clovek.php a class.Auto.php to budú akože classy, čiže triedy, čiže vzory objektov.
Otázka č. 1 - viem,ž e v každej classe by mal byť _construct, ale čo konkrétne tento obsahuje? Všetky vlastnosti daného objektu? Construct by malo byť niečo ako pravidlo, čo môže daný objekt obsahovať?
do neho teda vpíšem všetky funckiu a všetky premenné, s ktorými bude objekt pracovať, ak tomu dobre rozumiem?

Teraz ďalší problém. Public a PRivate functions. Aký je medzi nimi rozdiel? Definícia, že public functions sa nemôžu volať zvonka objektu mi veľa nehovorí. Ak mám napr.
class Clovek {
public function Jedz()
{
echo "ham-ham";
}
}

je mi jasné, že funkciu volám staticky ako Clovek::Jedz();
Aký je však rozdiel v tom, ak by som to definoval ako
private funcion Jedz()? Čo by sa zmenilo? Kedy by som nemohol použiť vyššie uvedené volanie?

Je mi jasné, že statické volanie funkcie je to isté, akoby som definoval novú funkciu vo functions.php pri procedurálnom rpogramovaní. V podstate sa to neodlišuje. Tiež by som vo functions.php mohol definovať Jedz() {
echo "ham-ham";
}
a potom iba zavolať funkciu ako Jedz(), funkcia však nepatrí objektu, metóda objektu patrí (dobré rozumiem, že funkcie objektu sa volajú metódy?)

A teraz dynamické volanie metódy...
$Clovek->Jedz(); čo znamená tento zápis? Ako sa odlišuje od Clovek::Jedz(); ? V čom je iný?

Ešte sa vrátim k tým public a private. Že metódu nie je možné volať zvonku znamená pre mňa asi toľko, že nemôžem napísať $Auto->Jedz()... ale to nemôžem predsa nikdy, ani keď je private, ani keĎ je public... vedel by mi to niekto ľudskou rečou vysvetliť?
Tiež viem, že nemôžem písať $Clovek->startujMotor();

Alebo to azda znamená, že ak mám
$Clovek->sadniDoAuta();
$Clovek->startujMotor();
? Niečo to má s týmto spoločné?

Viem, že som z toho vyrihaný, ale každá pomoc sa mi hodí. Ak by vedel niekto odporúčiť aspoň primitívny tutorial ohľadom OOP v PHP. Zatiaľ som pozeral niečo na brm.sk a na itnetwork.cz, ale veľmi som to veru nepochopil... Ďakujem za pomoc
lionel messi
Profil
jefitto44:
som začiatočník, prosím, nesmejte sa, aj vy ste raz začínali)
A niektorí stále začínajú. :-)

Na OOP nie som odborník, ale skúsim trošku pomôcť.

__construct (pozor, podtržítka sú skutočne 2 a nie 1) patrí medzi tzv. magické metódy, kt. sa volajú samé od seba pri istých situáciách. Konštruktor konkrétne je metódou, kt. sa spustí automaticky pri vytvorení inštancie objektu, netreba ju volať zvlášť, akoby si ju zavolal už tým, že vytvoríš inštanciu. Citujem z it-network: Slouží k nastavení vnitřního stavu objektu tak, aby byl připraven k použití. Pokud má naše třída konstruktor, nelze její instanci vytvořit jinak, než právě použitím konstruktoru. . Konštruktor kód skracuje, udržiava prehľadný a bráni niektorým chybám (nemôžeš vytvoriť nenastavenú inštanciu).

Majme kód:
class Clovek
{
  public $vek;
  public $jazyk;
  
  public function __construct($vek, $jazyk)
  {
    $this->vek = $vek;
    $this->jazyk = $jazyk;
  }
}
Teraz vytvoríš inštanciu triedy s priradenými atribútmi jednoducho:
$jano = new Clovek(35, "PHP");
namiesto zdĺhavejšieho postupu bez konštruktoru:
$jano = new Clovek();
$jano->vek = 35;
$jano->jazyk = "PHP";



jefitto44:
Public a PRivate functions
Presnejšie public, protected a private functions. Ide o tzv. „zapuzdrenie“.

Definícia, že public functions sa nemôžu volať zvonka objektu mi veľa nehovorí.
Ani mne, nemali by to byť private?

A teraz vážne. K private atribútom/metódam môžeš pristupovať zvonka. Čiže:
class Auto
{
  public $znacka;
  private $ecv;
}

$seat = new Auto();
$seat->znacka = "Seat Leon"; //v pohode prejde a nastaví atribút
$seat->ecv = "BA-138FA"; //vyvolá chybu, private atribút týmto spôsobom nenastavíš
Zapuzdrenie ti umožní lepšiu kontrolu nad návrhom aplikácie tým, že si ju nemôžeš rozbiť — opäť citujem itnetwork:
U naší třídy člověk by mohl být problém ve chvíli, když by měla mít atribut $datumNarozeni a na jeho základě další atributy: $plnolety a $vek. Kdyby někdo objektu zvenčí změnil $datumNarozeni, přestaly by platit proměnné plnolety a vek. Říkáme, že vnitřní stav objektu by byl nekonzistentní. Toto se nám ve strukturovaném programování může klidně stát. V OOP však objekt zapouzdříme a atribut $datumNarozeni označíme jako privátní, zvenčí tedy nebude viditelný. Naopak ven vystavíme metodu zmenDatumNaro­zeni(), která dosadí nové datum narození do proměnné datumNarozeni a zároveň provede potřebný přepočet věku a přehodnocení plnoletosti. Použití objektu je bezpečné a aplikace stabilní.

Zapouzdření tedy donutí programátory používat objekt jen tím správným způsobem
juriad
Profil
jefitto44:
1) Ano, doporučuje se mít jednu třídu v jednom souboru a mít nějaké stálé pojmenování. To později umožňuje automatické includy.
2) __construct je speciální metoda, která se zavolá, když použiješ new. Má za úkol převzít argumenty a připravit vzniknuvší objekt.
3) Rozlišuj pojmy metoda a funkce. Metoda je vždy uvnitř třídy a funkce je vždy mimo třídu. To, že se zapisují stejně je jen dobrá vůle tvůrců PHP.
4) public/private se skutečně liší jen tím, kdo je smí zavolat. Public jsou metody, které popisují, co obejkt umí. Privátní jsou ty jen pomocné, které jsou volány jen těmi public metodami. Uvědom si, že objekt toho může umět opravdu hodně. A některé části kódu se budou opakovat, takže bys jim normálně vytvořil novou funkci, ale ve třídě funkce nejsou, jsou jen metody. Protože necheš, aby tuto pomocnou metodu volal někdo zvenku a hrabal se ti ve střevech, deklaruješ ji jako privátní.
Ještě existuje protected, ale tím se zatím nezatěžuj; to je něco jako private, slouží to k dědičnosti.
5) Metody Jedz budeš vždy volat skrze instanci člověka. Třída člověk - tedy žádný konkrétní, jen šablona člověka - jít neumí.
$jefitto44 = new Clovek();
$jefitto44->Jedz();
Pokud by byla privátní, tak by PHP zařvalo.
6) Ano, pokud budeš používat jen statické metody, pak vlastně jen simuluješ jejich jmenné oddělení.
Místo XX_YY() budeš psát XX::YY().
7) Matdou můžeš volat jen jedním způsobem; kterým závisí na tom, zda je statická (klíčové slovo static) nebo není.
čtyřtečka :: se používá pro statické volání
šipka -> pro instanční

Zkus si to představit na reálném příkladu, třeba http://cz1.php.net/class.datetime
Máš tam seznam metod a konstant, které jsou vidět ven. Některé metody jsou statické - které a proč? Protože nepracují s žádným objektem, říká se jim tovární metoda, pokud nový objekt vytváří třeba jako datum z řetězce.

Tady máš zdroják té třídy: https://doc.habariproject.org/datetime_8php_source.html
Na řádce 315 je definovaná privátní metoda - je privátní protože slouží jen pro potřeby volání na řádku 306. Není dobrá k ničemu jinému, proč by měla plevelit seznam metod určený uživatelům této třídy?
Joker
Profil
jefitto44 [#1]:
Otázka č. 1 - viem,ž e v každej classe by mal byť _construct, ale čo konkrétne tento obsahuje?

Lze si to představit jako událost vytvoření objektu. Dají se tam nastavit nějaké počáteční hodnoty a podobně. Každý objekt nemusí mít nutně konstruktor, když tam není co dělat, nemusí ho mít.

Teraz ďalší problém. Public a PRivate functions. Aký je medzi nimi rozdiel? Definícia, že public functions sa nemôžu volať zvonka objektu mi veľa nehovorí.
Ohledně funkce vs. metody viz juriad.

A co je na tom nejasného? Jestli metoda jde nebo nejde volat mimo objekt je přece podstatná věc.
Kdokoliv bude chtít ten objekt nějak používat, potřebuje znát výčet veřejných (public) vlastností a jejich funkci. (Tomu se říká protokol třídy.)
Ty soukromé slouží pro vnitřní potřeby toho objektu a jako uživatele mě nezajímají.

Třeba třída Auto může mít metodu Nastartuj(). U reálného auta nastartování vyvolá desítky či stovky nějakých interních procesů (analogie k soukromým metodám), které ale mě jako uživatele nezajímají a nepotřebuji o nich nic vědět.

dobré rozumiem, že funkcie objektu sa volajú metódy?
No, dejme tomu.
Když se ponoříme jen do světa uvnitř objektu, metody budou něco jako ve strukturovaném programování funkce.

$Clovek->Jedz(); čo znamená tento zápis? Ako sa odlišuje od Clovek::Jedz(); ? V čom je iný?

To první se vztahuje k instanci, tj. k nějakému konkrétnímu existujícímu člověku. To druhé ke třídě, tj. k samotnému konceptu člověka.
Z toho vyplývá, že u metody Jez by bylo správně to první, protože jíst může jen konkrétní člověk, obecná představa člověka jíst nemůže.

Statická vlastnost u člověka by mohl být třeba biologický rod, protože z faktu že je někdo člověk vyplývá, že je to živočich rodu Homo.
U auta by třeba statická metoda mohla být jeMotoroveVozidlo(), protože už z členství v třídě Auto vyplývá hodnota true.

Je mi jasné, že statické volanie funkcie je to isté, akoby som definoval novú funkciu vo functions.php pri procedurálnom rpogramovaní. V podstate sa to neodlišuje.
Liší se to.
Statická metoda je pořád součást té třídy a měla by realizovat nějaké chování té třídy.

Liší se to i v praktickém programování, kdybych měl soukromé statické vlastnosti třídy, statická metoda s nimi může nakládat, funkce ne.

Ak by vedel niekto odporúčiť aspoň primitívny tutorial ohľadom OOP v PHP.
Snad něco bude na Péhápku do příštího… geologického období :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: