(ne)povinný getter
- Aleš
- Člen | 30
Zdravím,
nešlo by udělat gettery nepovinné? Nevidím důvod proč by povinné být měli.
Využití vidím například následujcí.
- Mám model tahajcí jeden řádek z DB.
- V modelu mám vlastní __get, který vrátí (pokud existuje) daný sloupeček z vyčteného řádku.
- K tomu mám napsané jednotlivé settery pro sloupečky (ošetřují např datum posledni úpravy, konzistenci dat atp)
Jenže Nette při pokusu o zápis bude hlasit ( a hlásí :-( ) že proměnná neexistuje. (Protože před ověřením setterů nejdřív ověřuje get/is, ale ty neexistují).
Takže mám na výběr
- buď si napsat vlasní setter (zbytečný kód navíc, ale prozatím jsem skončil tady)
- vytvořit dummy get funkci ( která nebude nikdy volána ale Nette bude mít radost že existuje a povolí mi setter)
- upravit si ObjectMixin (což je blbost)
Rád bych tedy věděl zda je nějaký objektivní důvod proč jsou gettery povinné a zda to není jenom malá okrasa, popřípadě zda by nešla tat vychytávka dopříště vypustit.
- Aleš
- Člen | 30
Ok, asi jsem to napsal špatně, nebo nevím. Možná kus pseudo kodu pomůže:
<?php
class Priklad {
private $data;
public function __construct($id){
$this->data = Array("id" => $id,
"text" => "text123",
"upraveno" => time() );
}
public function setText($hodnota){
$this->data["text"] = $hodnota;
$this->data["upraveno"] = time();
}
public function __get($promenna){
if( isset($this->data[$promenna])) return $this->data[$promenna];
}
}
//////////////////
$test = new Priklad(10);
echo $test->id; // 10
echo $test->text; // text123
$test->text = "Lorem"; // <- chyba, seter se nevezme v uvahu protože neexistuje takový getter, to ale neznamená že proměnní nejde přečíst!
?>
- Aleš
- Člen | 30
Fajn tak o co mi jde se mi už koukám podařilo vysvětlit. Teď ještě zkusím znova přepsat na co se ptám.
Jak to vyřešit vím (to bych jinak nepsal jsem ale do řešení potíží), ale i tak díky za radu (taky jsem to tak udělal, je to v prvním postu)
Klíčová otázka tedy je:
Existuje nějaký objektivní důvod proč tomu tak je?
- David Grudl
- Nette Core | 8218
Write-Only properties se obvykle považují za chybu návrhu, proto je Nette nepodporuje.