Autor Zpráva
alfa47
Profil *
Ahojte,

robim triedu na ziskavanie roznych entit v textoch a nechapem, ake vyhody moze mat staticka trieda.

Teda moj kod viem vykonat 2 sposobmi:

1. sposob:
$city = new EntityDetector;
echo $city->getCity($text);

// 2. sposob:
echo EntityDetector::getCity($text);

Existuju nejake pravidla, kedy sa ktore oplati pouzit? Staticka trieda mi pride jednoduchsia, ale niekde asi bude nejaky zadrhel, ze to je pomale, alebo nieco take. Prosim, skuste mi to niekto vysvetlit, nech nam je to vsetkym jasne.

Vopred dakujem velmi pekne.
Alphard
Profil
Jestli to zvládnete staticky, bude to spíš rychlejší, ale to je zanedbatelné.
Staticky nemůžete vytvářet a odlišovat instance. Hodí se to na funkce, které nezávisí na dalších vlastnostech třídy. Moje snaha vysvětlit to vlastními slovy selhala (nepochopil bych to ani já sám), takže mažu a odkazuji interval.cz/clanky/oop-v-php-staticke-vlastnosti-a-metody.
Tori
Profil
Možná by se statická vs. instancovatelná třída dala rozlišovat podle toho, co představuje: má to být objekt (tedy balík dat a metod na jejich změny/čtení, resp. věc a její chování)? Anebo to jsou dohromady zabalené vzájemně nezávislé ale přesto příbuzné funkce (typu String::autoUtf nebo String::webalize), které třeba používají stejná nastavení?

A pro statické metody navíc platí i případy, kdy fungují jako továrnička na instanci (vzory Singleton, Factory) anebo se, jak píše Alphard, týkají buď všech nebo žádné instance třídy (tedy totéž jako statická proměnná).

Takže v tom vašem případě bych to rozlišovala takhle:
// 1. celá instance pracuje s jedním textem, může si ho třeba nějak předem rozebrat apod.
$entities = new EntityDetector($text);
echo $entities->getCity();
echo $entities->getStreet();

// 2. třída je jen obálka pro vzájemně nezávislé metody, které ze zadaného textu něco vytáhnou
echo EntityDetector::getCity($text);
echo EntityDetector::getStreet($anotherText);
alfa47
Profil *
Tori:
Dakujem velmi pekne za vysvetlenie... ono by mozno bolo dobre, kebyze su funkcie staticke aj instacovatelne zaroven. Teda, ze by som to pouzival podla potreby, ako je uvedene aj v pripade... proste by slo vypisat obe verzie naraz. Toto nejde vsak?
Tori
Profil
Kdyby to byl vzor Singleton, tak by dávalo smysl použít magickou metodu __callStatic. Kvůli čemu potřebujete obojí - abyste nemusel všude předávat instanci?
alfa47
Profil *
Tori:
No napriklad na situaciu, aku si ty uviedla v priklade. Proste ked budem mat jeden a ten isty text, pouzijem prvy pripade, ale ked budem to chciet pouzivat na nezavislych textoch, tak pouzijem druhy sposob.
Jan Tvrdík
Profil
alfa47:
Doporučuji se statickým věcem vyhnout, jak jen to je možné, protože co je statické, to je globální a co je globální to je špatné (zjednodušeně). Z pohledu OOP by ani nic statického existoval nemělo, takže každá statická metoda je v podstatě porušení OOP. Statické třídy / metoda trpí podobnými problémy jako např. Singleton.
alfa47
Profil
Jan Tvrdík:
dakujem za objasnenie, je mi to jasnejsie.

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:

0