Autor Zpráva
skotouc
Profil *
Zdravím,
mám dotaz k PHP třídám:
Když zapisuji hodnoty třídy - některé chci aby se z objektu daly pouze číst a nešly změnit, jiné naopak chci, aby jim uživatel mohl nastavit hodnotu. Ale nevím, jak toto v deklaraci vlastností rozlišit. Všem musím dát viditelnost public, jinak je zvenku nepřečtu.
Šlo by s tím něco samosebou dělat pomocí __get, ale to se mi nezdá moc dobré, neni pak přímo u deklarace vlastnosti vidět zda je jen pro čtení nebo nastavitelná (v obou případech má public).

Lze toto v PHP nějak rozlišit?

Díííky
Majkl578
Profil
Vlastnosti třídy by měly být private/protected a třída by měla poskytovat API okolí přes gettery, settery nebo obojí. Gettery hodnoty vrací, settery nastavují.

class Foo
{
    private $bar;
  
     public function getBar()
    {
        return $this->bar;
    }
  
     public function setBar($bar)
    {
        $this->bar = $bar;
        return $this;
    }
}
Ugo
Profil
přesně tak, mimochodem public funkce sou taky zlo, já radím všemu dát private a pak to nepoužívat :) - rozlišení pro čtení/zápis takto není, jedině tedy přes metody at už magické nebo normální
Nox
Profil
Ugo:
public funkce sou taky zlo
??
Mastodont
Profil
Ugo chtěl napsat "public vlastnosti"

Majkl578:
Pokud v setteru nijak nekontroluješ novou přiřazovanou hodnotu, tak je celá dvojice metod zbytečná a člen může být public (je to taky výrazně rychlejší)
Tori
Profil
skotouc:
Nette má read-only vlastnosti řešené docela hezky - existuje-li metoda getVlastnost(), je vlastnost čitelná. Existuje-li setVlastnost(), je i zapisovatelná (docs, řeší to tuším třída Nette\ObjectMixin).
pajousek
Profil
Mastodont:
Už se těším na ten okamžik, až jednou zmoudříš a budeš si ten svůj bordel - který tu všude propraguješ - refactorovat ... a nebo alespoň na tu chvíli, až jednou uděláš settery a budeš kvůli změně rozhraní přepisovat všechny výskyty té třídy. :)
Mastodont
Profil
existuje-li metoda getVlastnost(), je vlastnost čitelná. Existuje-li setVlastnost(), je i zapisovatelná
No to je ale třeba v C# úplně normální vestavěná syntaxe. Jak jinak by to taky mělo být? :-)
Tori
Profil
Mastodont:
Jak jinak by to taky mělo být? :-)
No ano, ale jde o to, že je-li třída potomkem Nette\ObjectMixin, tak v obou případech používám jen $instance->vlastnost. (Takže byste v tom pajouskem zmíněném případě nemusel měnit použití vlastnosti na volání metod, ale jen přidat get/set metody a společného rodiče s touto funkcionalitou). Možná to v C# takto funguje implicitně, nevím, neznám ho.
Mastodont
Profil
pajousek:
No když budu takovej vůl a nepoznám, že nějakej field má být ve skutečnosti property, tak si to holt zrefaktoruju. Nejsem génius, abych znal pravé a jediné řešení, kterého se budu potom držet zuby nehty.
Ugo
Profil
Mastodont:
chtěl jsem napsat metody či funkce třídy, prostě tak jak jsem to napsal, narážím na to že getBar, setBar je totální kravina kterou se obchází něco co nemá rozumný základ a je postaveno na základě "drogy jsou špatné, protože jsou špatné".

Tori:
V nette to bude také řešeno jen pomocí __get() a __set(). Čili je to asi 8 řádků kódu to takto vyřešit.

pajousek:
jednou taky zmoudříš a pochopíš že gettery a settery kde je jen přiřazení vlastnosti jsou kravina, přesně kvůli takovýmto funkcím pak člověk hodinu louská kudy všude to prochází a nakonec zjistí, že za 10 funkcema se skrejvá jenom echo a nebo $x=$x :D ... trošku bordel do tý přehlednosti vnášej magický metody jelikož to je opravdu úplně neprustřelný, když člověk vidí normální přiřazení a udělá to cestu kolem světa, ale vyhnout se tomu a mít pěknou syntaxi je asi nemožné, ostatně třeba Nette je magie plné taky.

PS: kouknul jsem do nette na rychlo a jsou to magické metody na \Nette\Object jež volají staticky ObjectMixin::get()|set() , btw. takovej výtažek oproti rodičovství
final class ObjectMixin
Bertram
Profil
Ugo:
gettery a settery kde je jen přiřazení vlastnosti jsou kravina
Ahoj, víš o tomto:
$obj->preklep = "nová vlastnost";
Ugo
Profil
Bertram:
Vím, když náhodou v kódu ten překlep udělám aniž bych si ho ihned tak ho většinou velice rychle odhalím po tom co to nedělá co by mělo, a víš co udělá $obj->preklep() ? Rozhodně větší neplechu než ona vlastnost. (vím že právě na to narážíš, ale když si jako já zvykneš dělat věci rovnou na ostrém FTP, tak tě takovejle error může pěkně naštvat) ... na tohle taky navazuje jistá logika pojmenování, která by i mimo jednoznačný název měla být lehko psatelná.
Bertram
Profil
Ugo:
Já jsem nemyslel volat přímo setter, ale že se kombinací s metodou __set(), dá zjednodušit zápis zahrnout validaci, zachovat zapouzdření a mít jednoznačnou informaci kde a jakou chybu (např. syntaxe) jsem udělal.
Nehledě na to, že pokud budu chtít pracovat s vlastností, která je pole, tak syntaxe zůstává jednoduchá a přehledná.
No a o tom, že tam mám getery, setery a magické metody přece vím, když jsem je tam sám napsal.

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