Použitie "Logical NOT" (!) operátora na objekt v PHP rubrika: Programování: PHP

2 Michal Zahradníček
položil/-a 19.3.2015

Zdravím,

je nejaká možnosť ako použiť operátor ! na kontrolu stavu objektu?

Uvediem príklad

class TestObj {
    protected $data = [ ];
 
    function get()...
    function set()...
 
    //nejaka magic metoda
    function _state() {
        return !empty($this->data);
    }
}
 
$a = new TestObj();
$a->set('klobasa');
 
if (!$a) echo 'Objekt nema data';
if ($a) echo 'Objekt ma data';

Teoreticky sa da pouzit implement Countable a kontrolovat pocet poloziek, ale nie je to velmi elegantne...

Dakujem za vase napady a nazory.

odkaz
10 jiri.knesl
odpověděl/-a 19.3.2015

Použij metodu hasData, která vrací boolean a tu volej v ifu.

Nejblž tvému řešení je přetížit metodu __toString() a v if(! (string) $obj) porovnávat takto. Ale je to prasárna. Založ si na to metodu (viz předchozí řádek) a udělej to pomocí ní.

Dál pak je otázkou, jestli potřebuješ tahat nějaká fakta o objektu, jestli nebude vhodnější vtáhnout logiku přímo do dané třídy.

Komentáře

  • Michal Zahradníček : Chcel som sa tak trocha vyhnúť volaniu funkcie a spraviť to trocha elegantnejšie, ale asi to inak nepôjde. Jedná sa o triedu typu MODEL, kde by sa vlastne takto kontrolovalo, či je MODEL inicializovaný - teda či sú v ňom načítané data z DB a pod... Dík za názor. 19.3.2015
  • Kit : K čemu se hodí v Modelu data z DB? 19.3.2015
  • Michal Zahradníček : Aby som bol úplne presný jedná sa o triedu entityModel. Teraz už to zúčastneným stranám snáď dáva zmysel. 19.3.2015
  • arron : Tak entity nebo model? Zavání to porušením SRP. Buď je to entita (a pak má v sobě jenom data) a nebo je to model (a pak jenom manipuluje s entitami). Nebo je to teda active record a pak už to imho fakt porušuje SRP. Btw. co je neelegantní na volání metody? Ve chvíli, kdy je jasně pojmenovaná, tak dost zpřehledňuje kód, protože !$a může znamenat uplně cokoliv, takže čtenář kódu (a ani Ty sám) už příští týden nebude vědět, co přesně to znamená a bude muset lézt do kódu té třídy (až teda někde dohledá, že v $a je instance třídy). 20.3.2015
  • Michal Zahradníček : Je to vlastne activeRecord - zle som sa vyjadril. Beriem Vaše argumenty, že !$a môže znamenať čokoľvek. Ale nie je mi úplne jasné v čom sa porušuje SRP - poprosím konkrétnejší príklad. 20.3.2015
  • nixbody : @arron: Entita je součástí modelu, konkrétně doménového modelu. Pokud entita obsahuje jen data a žádné chování, jedná se o příklad anemického modelu, který je považován za anti-pattern. 20.3.2015
  • arron : @Nobody: Ale entita může mít stav, může mít metody na nastavování dat ($article->publish() který např. nastaví stav na published a published_date atd.), může mít další metody na manipulaci se svými daty, ale imho by neměla mít například metodu ->save(). Má se starat sama o sebe, ne o to, jak a kde je uložena. 20.3.2015
  • rmaslo : Asi ještě rychlejší (ve smyslu na méně znaků zápisu) než if(!(string)$obj) by bylo využít __invoke na vracení stavu objektu a ptát se if(!$obj()) 25.3.2015
  • kohven : Bohužel už si nepamatuji, kde to bylo, ale někde jsem četl, že poměr času tráveného na [čtení kódu] : [psaní kódu] odpovídá za celkovou životnost projektu poměru 4:1. Jinými slovy mnohem častěji se kód čte než píše, takže efektivita psaní není tak rozhodující a elegantnost nespočívá v zápisech ala perl ale v dobré čitelnosti. Čemuž osobně docela věřím. 26.3.2015
  • Kit : @kohven: Četl jsem, že ten poměr je dokonce 9:1, ale asi hodně záleží na kvalitě kódu a množství WTF v něm obsažených. 26.3.2015

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.