Portál AbcLinuxu, 29. dubna 2024 10:48


Dotaz: PHP OOP dedicnost vs polymorfismus?

28.9.2020 13:22 Fanda
PHP OOP dedicnost vs polymorfismus?
Přečteno: 621×
Odpovědět | Admin
Zdravim

Teprve se vsechno ucim chapat, takze dotaz bude zrejme stejne zmateny jako titulek...

Dejme tomu, ze mam tridy FyzickaOsoba a PravnickaOsoba, ale chtel bych k nim pristupovat stejnym zpusobem. Tj. jako k tride Osoba a nerozlisovat mezi nimi dokud vylozene nemusim

Jak to udelat spravne?

Pomoci interfejsu nebo abstraktni tridy nebo si vystacim s pouhym "extends"...?

Diky

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

28.9.2020 14:27 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud má každá uvnitř fungovat jinak, tak je nejlepší definovat společné rozhraní a napsat k němu dvě třídy FyzickaOsoba a PravnickaOsoba.

Pokud však potřebuješ společné některé vlastnosti a hlavně metody, může být namístě definovat společného rodiče Osoba. Je však dobré se vyhnout protected atributům, jinak z toho snadno vznikne guláš. Je lepší, když jsou všechny private.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
28.9.2020 14:46 Fanda
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Diky

No chtel bych, aby se chovaly vicemene stejne, budou se lisit jen v nekolika atributech a metodach

Jenomze kdyz budu mit tridu Osoba, ktera bude mit dejme tomu atributy/metody:
  • kontaktni_adresa
  • kontaktni_telefon
  • kontaktni_email
a z ni podedim tridy PravnickaOsoba a FyzickaOsoba... budu chtit, aby Smlouvu ode me mela jenom >Osoba< a budu chtit, aby budto mela Osoba->dic nebo mela Osoba->rodne_cislo... Proste Smlouvu muze mit jak fyzicka tak i pravnicka osoba a ja to nechci resit (dokud nemusim)

Zkratka mi hlava nebere jak to udelat :(

Gréta avatar 28.9.2020 16:22 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?

nóó vošklivý řešení je tam mit bool jestli je fyzická nebo právnická nebo univerzální string/nějakou svou třídu 'identifikátor'. noa hezký řešení asi takle. phpkář dušan to potom dyštak snad jakoby vopravý/rožšíří nějak :D :D :D :D ;D ;D

todleto řešení je postavený na funcki get_class hele

noa jako další možný hezký řešení by asi jako šlo mit ve třídě osoba abstraktní metodu 'identifikuj_se' kterou by si ty děcký voběkty nějak všecky řešily po svým. jak dělat abstraktní třídy/medoty návod třeba tady hele :O ;D


// abstraktní třída osoba
// tamto 'abstraktní' znamená jakoby jenom to že nejde vyrobit instance tý samotný třídy
// slovíčko abstract nastrkávej až si budeš uplně jistej tim svým oběkovým návrhem rači 
class Osoba 
{  
    private $adresa;
    private $telefon;
    private $mail;
    
    // konstruktor
    function __construct($adresa, $telefon, $mail) {
        $this->adresa = $adresa;
        $this->telefon = $telefon;
        $this->mail = $mail;
    }
    
    // gettry/settry
    
    function set_adresa($adresa) {
        $this->adresa = $adresa;
    }
    function get_adresa() {
        return $this->adresa;
    }
    function set_telefon($telefon) {
        $this->telefon = $telefon;
    }
    function get_telefon() {
        return $this->telefon;
    }
    function set_mail($mail) {
        $this->mail = $mail;
    }
    function get_mail() {
        return $this->mail;
    }
}


class PravnickaOsoba extends Osoba
{
    private $dic;
    
    function __construct($adresa, $telefon, $mail, $dic){
        //volání konstrukoru rodiče
        parent::__construct($adresa, $telefon, $mail);
        $this->dic = $dic;
    }
    
    function set_dic($dic) {
        $this->dic = $dic;
    }
    function get_dic() {
        return $this->dic;
    }
}

class FyzickaOsoba extends Osoba
{
    private $rodneCislo;
    
    function __construct($adresa, $telefon, $mail, $rodneCislo){
        parent::__construct($adresa, $telefon, $mail);
        $this->rodneCislo = $rodneCislo;
    }
    
    function set_rodneCislo($rodneCislo) {
        $this->rodneCislo = $rodneCislo;
    }
    function get_rodneCislo() {
        return $this->rodneCislo;
    }
    
}

// funkce co dělá že vypiše osobu
// asi by bylo hežčí udělat to jako statickou funkci tý třídy osoba nebo 
// eště lepšejc jako nějakou abstraktní metodu 'vypiš' se ve třídě 'Osoba' a děti by si to nějak už zařídili posvým :D ;D
function vypisOsobu($osoba)
{
    echo $osoba->get_adresa();
    echo '<br>';
    echo $osoba->get_mail();
    echo '<br>';
    echo $osoba->get_telefon();
    echo '<br>';

    //funkce get_class dělá že vrací string s názvem třídy
    // nevim jak moc se muže rtti v php prodražit a jestli by nebylo lepčí
    // řešení mit na to nějakej enum nebo co voni v php maj pokavaď bys
    // měl víc než pár tříd :O :O
    if(get_class($osoba) === 'PravnickaOsoba')
    {
        echo $osoba->get_dic();
    }
    else
    {
        echo $osoba->get_rodneCislo();
    }
    echo '<br>';
}

// a teďo si to vyskoušíme na pepkoj a jednom takovým podnikateli politickým hádejte hádejte :O :D :D ;D
$osoba1 = new FyzickaOsoba('pepek novak, pospoloprty', 123456789, 'pepek@seznam.biz','pepkovo rodny cislo');

$osoba2 = new PravnickaOsoba('capak', 257171111, 'posta@vlada.cz', 'CZ46900411');

vypisOsobu($osoba1);
echo '<br>';
vypisOsobu($osoba2);

echo '<br><h1>hotovo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</h1>';
?> 


Gréta avatar 1.10.2020 14:15 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?

to co sem fanda psal nebyl spam!!!!!!! :O :O :O :O :O :O :D :D :D :D :D :D

mi jako jenom taktně naznačoval že mi houby rozumí :D :D ;D ;D

2.10.2020 10:08 Ján Dráb | skóre: 4 | Banská Bystrica
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Nejako si pozabudol na existenciu __set() a __get(), ked už píšeš nejaký kód :)
Everything has room for improvement.
2.10.2020 11:05 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Celý ten kód je jak z minulého století, takže magické metody bych v něm ani nehledal.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gréta avatar 2.10.2020 13:44 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?

tttssssssssssssssssssssssssss náhodou je tam kouzelná metoda __construct :D :D ;D ;D

2.10.2020 14:04 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Máš plus body za to, že jsi tam ani jednou nepoužila slovo "protected". V PHP ho nesnáším.

Ovšem když už tam máš __construct(), k čemu jsou pak ty gettery a settery?
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gréta avatar 2.10.2020 16:17 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?

slovíčko protected nesnáší každej kdo ho jakoby musel aspoň jednou někde nějak vobcházet nóó takže ho taky nemam moc ráda :D :D ;D ;D

noa k čemu sou ty gettry/settry???? nóó teďko už vim že takle psaný celkem k ničemu v php :D

2.10.2020 17:37 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Rozmyzlam, ze mozno kvoli tomu,ze PHP ma premenne silne polymorne, tak cez set/get vies filtrovat ze da spravny typ. Ak das nevhodny objekt (nie je instanciou tej triedy ktoru potrebujes), tak vychodis chybu/warning.
debian.plus@protonmail.com
2.10.2020 18:20 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Faktem je, že obvykle nedostávám ani noticky, i když je mám zapnuté.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gréta avatar 3.10.2020 14:49 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?

toldeto se už +- řikalo hele vlákno :D ;D kit tam řikal víc důvodů proč si myslí že to v php neni zase tak důležitý mit tam typy

3.10.2020 15:18 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Typy nejsou důležité. Nejsou ani samospasitelné, protože není problém napsat program typově správně, ale ve výsledku zcela blbě.

Práce v typově slabém jazyce však vyžaduje jiný přístup, než práce v typově silném. Pokud je u nábytku místo výšky uvedeno "na objednávku", tak to ničemu nemusí vadit. Pokud tam však má být počet kusů, tak je namístě v konstruktoru ošetřit, že na vstupu má být kladný int, který nebude větší, než určitý limit, případně ještě omezený stavem skladu. Všimněte si, že na tohle většina programovacích jazyků ani typ nemá, ale databáze ho mají. Proč to nesvěřit databázi, když to umí?
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
2.10.2020 11:57 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
debian.plus@protonmail.com
Gréta avatar 2.10.2020 13:43 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?

to sem teda jako nepozabudla sem to totiž jako vůůůůbec nikdy neslyšela že v php takovej rovnák na vohejbák existuje :D :D ;D ;D

btw jak efektivně v takovým gettru/settru vynutíš datovej typ anižbys ho buť při každým voláním nastavoval nebo v tý __set měl třeba nějakej switch/case a podle ména cpal typy?? :O :O třeba tenleten příklad hele přectav si žeti tam někdo skusí do tý tvý proměný height narvat string :O ;D

2.10.2020 13:58 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
A čemu to vadí? Pokud je to specifikace nábytku v katalogu, tak tam může nacpat i měrnou jednotku. Jistě, je dost případů, kdy potřebuješ int a ten si ošetříš dle potřeby. Ovšem to ti třeba MySQL udělá také a navíc bez starostí.

V PHP se o typy moc starat nemusíš, pokud nechceš. V Javascriptu na typy dlabou úplně a nikomu to nevadí.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gréta avatar 2.10.2020 16:26 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?

se řiká že prej se nikdy nesmí veřit uživateloj nóó tak mi připadá takový jakože logický hlídat si ty typy kromě před databází taky hnedka navstupu. typy se taky hoděj protože proměnou de blbě pomenovat a pak nemusí bejt jasný co obsahuje. navíc na pozadí všecky ty proměný maj nějakej typ a nemit nad tim možnost kontroly mi připadá takový divný :D

V Javascriptu na typy dlabou úplně a nikomu to nevadí.

nóó asi nevadí ale s vyjímkou lidí co si vyrobili typescript :O :D :D ;D

2.10.2020 17:16 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Databáze si to dokáže ošéfovat sama, vstupy není třeba hlídat. Dělal jsem na appce, kde se vstupní data kontrolovala celkem 4×, z toho 3× zbytečně a pak to teprve šlo do databáze. Šéf to nařídil... A stejně to bylo blbě. Kdyby místo 4 povrchních kontrol byla jedna důkladná, tak s tím nebyly potíže.

Data na vstupu zásadně nekontroluji, to dělá až business vrstva, která nejen kontroluje jejich formální správnost, ale dokáže vyhodnotit i případnou kolizi s jinými daty a takový vstup odmítnout.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
28.9.2020 16:30 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Proč bych měl do třídy Osoba dávat kontaktní adresy? Udělej si na to další třídu.

Proč tam chceš rodné číslo u fyzické osoby? Myslíš si, že ti ho ta fyzická osoba dá?

Tyhle věci navrhuji vždy směrem od databáze, tedy nejprve datovou strukturu a k tomu v PHP udělám vazbu s uživatelem. Nakonec zjistíš, že ti stačí jediná třída Osoba, ke které přidáš tabulku a třídu Kontakt, případně další tabulku a třídu Smlouva.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
28.9.2020 17:47 Fanda
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
No beru to tak, ze osoba muze mit nepreberne telefonnich cisel, emailu a adres, takze to resim vztahem has_and_belongs_to_many

Ale vzdycky muze mit (pro me) jen jednu kontaktni adresu, telefon a email. Tak proc nemit v tabulce "osoby" odkazy na vsechny tyhle has_one vazby?

28.9.2020 19:23 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Také nemusí mít žádnou adresu.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gréta avatar 1.10.2020 14:25 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?

'takže todleto si kupujeme na firmu noa támhleto si kupuju jenom na sebe. mail telefoní číslo a dodací adresu použijte v obou případech stejnou přece to nebudete posílat ve dou balících a mi si to už nějak poznáme nóó a kdyby byly problémky tak volejte na jedno z těhletěch dejme tomu pěti čísel mě asi nezastihnete ale von to věčinou vždycky někdo veme a převezme balík. noa kdyby přeci ne tak nechte balik u pani sousedky vomáčkový ve vedlejším baráku my sme tak domluvený že ji pak po někom pošlu peníze' :D :D ;D ;D

1.10.2020 20:09 Fanda
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Ty poslys, Greto, kdyz uz jsi takovy vtipny, chytry a velkouzasnolepy... Vysvetli mi jeste k cemu jsou Interfaces

Interface prece znamena rozhrani, ne? A da se to nejak pouzit proti cizi knihovne?

Kdyz budu chtit pouzit nejakou "vendor" knihovnu, tak je pro me prece lepsi si mezi svoji aplikaci a tu knihovnu dat rozhrani, ne? Kde si nadefinuju vlastni metody a moje aplikace bude volat jenom tyhle vlastni metody

Takze kdyz se autor te cizi knihovny rozhodne vsechno prekopat, nebo kdyz se rozhodnu tuhle knihovnu nahradit jinou, tak mi staci prepsat jenom to rozhrani, kdyz zachovam nazvy metod a parametry, a na zbytek aplikace nemusim sahnout. Je tak?

Ale k tomu mi prece staci vytvorit si vlastni zdedenou tridu, ne? Neco jako:

class DatumCas extends DateTimeImmutable

Ja myslel, ze na to je prave to "Interfaces", ale zatim co koukam na priklady, tak kazdy dela Interface jenom vuci vlastnim tridam

Nebo mi neco unika?

A sarkasmem klidne nesetri, jenom ho prosim neaplikuj tolik, ze ti neni rozumet

Diik ;)
1.10.2020 21:00 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
To jsi zhruba popsal návrhový vzor Adaptér. Je velmi užitečný a používám ho docela často. Dědičnost zde obvykle nemá využití - zejména proto, že tvůrci takových knihoven s oblibou své třídy označují jako "final".

Samotné rozhraní funguje trochu jinak. Je to jen seznam metod s parametry a konstant, které mají obě strany používat. Není přítomna žádná implementace. Tvůrce knihovny by takové rozhraní měl vytvořit a ty bys ho měl implementovat podle svých potřeb.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
1.10.2020 21:31 Fanda
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Tedy mam tomu rozumet tak, ze kdyz tvurce knihovny vytvori Interface, tak by tento nemel menit, jakkoli bude aktualizovat svoji knihovnu?

A ja si mam ke svym tridam vytvaret a dodrzovat vlastni Interfacy proto, abych nemusel vsechno prepisovat, kdyz se mi zamane neco v tech tridach zmenit?

Je-li tak, asi se mi zacina casit v makovici...

Tisicere Diky!
1.10.2020 21:55 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Ano, to rozhraní by měnit neměl, alespoň ne v minoritních verzích.

Ano, je rozumné si vytvářet vlastní rozhraní, abys kdykoli mohl zaměnit třídy, které to rozhraní implementují. Mám například třídy Author a Book, které mají stejné rozhraní a díky tomu mohu s jejich instancemi pracovat jednotně. Navíc můžu kdykoli přidat třeba třídu Article se stejným rozhraním a na zbytku aplikace nemusím nic měnit. Velmi to tu aplikaci zjednoduší.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
1.10.2020 22:24 Fanda
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Tyy jo, ta uleva... tusim se tomu rika "AHA efekt" a je to tak prijemny!

Ty bys mel, Kite, psat tutorialy!

Jeste jednou diky vsem a dobrou noc

1.10.2020 22:58 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Vysvetli mi jeste k cemu jsou Interfaces 
Vo svete PHP nie je oficialne nic take. Ale vo svete Java, trieda moze dedit iba z jedneho rodica. Ak chces viac (co napr. v C++ ide), tak musis pouzivat v Jave rozhranie (a je to nieco ine ako trieda, aj ked dost blizko).
debian.plus@protonmail.com
1.10.2020 23:39 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Trochu jsi zaspal dobu. V PHP je interface i dědičnost. Jen tam není (vcelku zbytečná) dědičnost od více rodičů. Některým ta vícenásobná dědičnost chybí až tak, že ji nahrazují (více či méně úspěšně) pomocí trait.

Interfaces v žádném případě nenahrazují vícenásobnou dědičnost. Mají zcela jiný účel.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
2.10.2020 11:59 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
PHP neviem, kedze PHP pouzivam ako procedurove/strukturove. Ok, mas pravdu. V PHP je nativne aj rozhranie.
debian.plus@protonmail.com
2.10.2020 12:41 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Jenom škoda, že hned ten první příklad je celý blbě. Správně je pouze syntakticky a občas může i fungovat. Vůbec však nerespektuje současné konvence.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
2.10.2020 14:16 Fanda
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Kdybys mel cas a chut, alespon v hrubych obrysech, uvest jak by ten prvni priklad mel vypadat, vubec bych se nezlobil

Panbu ti to ;)
2.10.2020 14:31 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP OOP dedicnost vs polymorfismus?
Zkusím jim to tam opravit, snad ten patch projde.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.