(ne)povinný getter

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Aleš
Člen | 30
+
0
-

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.

phx
Člen | 651
+
0
-

No kdyz neco nastavist tak by jsi mel mit i moznost to ziskat zpet.

Aleš
Člen | 30
+
0
-

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!
?>
Jod
Člen | 701
+
0
-

Tiež som sa párkrát čudoval prečo mi nefunguje setter. A bolo to preto lebo som nemal getter :) . Dá sa to spraviť aj tak že sa v getteri vyhodí výjimka, ale je to robota navyše a je to tam v podstate zbytočne.
V C# som nemal povinný ani jeden z nich, tak nevidím problém.

_Martin_
Generous Backer | 679
+
0
-

Když sis přepsal getter na vlastní, tak si holt musíš napsat i setter.

Aleš
Člen | 30
+
0
-

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 | 8142
+
0
-

Write-Only properties se obvykle považují za chybu návrhu, proto je Nette nepodporuje.

phx
Člen | 651
+
0
-

Konec koncu si muzete podedit a prepsat __get() a __set jak se libo ne?

Ale osobne souhlasim s Davidem. Sice obcas taky nejsem nadsen kdyz musis dopisovat get, ale prijde mi to logice a ty 3 radky me nezabiju.