Autor | Zpráva | ||
---|---|---|---|
emissary Profil |
#1 · Zasláno: 23. 12. 2012, 12:39:59
<?php require_once('interface/interface.Validator.php'); abstract class PropertyObject implements Validator { protected $propertyTable = array(); //sluzi na ulozenie paru nazov/hodnota //umoznujucich prevod nazvu a atributu na //nazvy stlpcov v databaze protected $changeProperties = array(); //zoznam atributov ktorych hodnoty boli nazvy zmenane protected $data; //vlastne data z databaze protected $errors = array(); public function __construct($arData) { $this->data = $arData; } public function __get($propertyName) { if(!array_key_exists($propertyName, $this->propertyTable)) { throw new Exception("Neplatný atribút \"$propertyName\"! "); } if(method_exists($this, 'get'. $propertyName)) { return call_user_func(array($this, 'get' .$propertyName)); } else { return $this->data[$this->propertyTable[$propertyName]]; } } public function __set($propertyName, $value) { if(!array_key_exists($propertyName, $this->propertyTable)) { throw new Exception("Neplatný atribút \"$propertyName\"! "); } if(method_exists($this, 'set'. $propertyName)) { return call_user_func(array($this, 'set' .$propertyName), $value); } else { //Pokial doslo k zemene hodnoty atributu a tato zmena niie je doposial //zaznamenana v poli changedProperties array, prida sa. if($this->propertyTable[$propertyName] != $value && !in_array($properyName, $this->changedProperties)) { $this->changedProperties[] = $propertyName; } //nastavenie novej hodnoty $this->data[$this->propertyTable[$propertyName]] = $value; } } public function validate(); } ?> Pri metóde __get neviem pochopiť kód od: if(method_exists($this, 'get'. $propertyName)) { return call_user_func(array($this, 'get' .$propertyName)); } else { return $this->data[$this->propertyTable[$propertyName]]; } method_exists() samotne slovko $this sa odvoláva na čo a ten ďalší argument 'get' ... no úplne som zmetený. A to isté aj pri metóde __set .
Ak by sa tu našiel niekto schopný, kto by mi to vedel dobre vysvetliť, tak budem veľmi vďačný. |
||
Alphard Profil |
#2 · Zasláno: 23. 12. 2012, 12:55:40
$this se odvolává na konkrétní instanci dané třídy, jako všude jinde. method_exists() zjistí existenci volané metody, pokud existuje, zavolá ji a vrátí výsledek, pokud ne, vrátí nějakou hodnotu z pole $this->data.
__get() a __set() jsou podobně jako __construct() speciální metody jazyka, které jsou volány za určitých okolností, viz manuál. |
||
Radek9 Profil |
emissary:
„samotne slovko $this sa odvoláva na čo“ Na aktuální objekt. „ten ďalší argument 'get' “
Zjišťuje, jestli existuje metoda s názvem té vlastnosti a prefixem get. Např. ze someProperty udělá getSomeProperty. Vybere tedy správný getter a zavolá ho. U set to stejné. |
||
Joker Profil |
#4 · Zasláno: 23. 12. 2012, 12:58:09
emissary:
Viz manuál, method_exists zkontroluje, zda objekt má danou metodu. $this je odkaz daný objekt, něco jako „tento objekt“. __get se zavolá při čtení vlastnosti, čili když někdo zkusí číst třeba $tenObjekt->neco. Metoda zkontroluje, jestli objekt má metodu getneco (= get + název atributu) a pokud má, tak ji zavolá. Jinak vrátí $this->data[$this->propertyTable["neco"]] |
||
emissary Profil |
#5 · Zasláno: 23. 12. 2012, 15:08:07
Joker:
Celkom tomu nechápem... public function __get($propertyName) { if(!array_key_exists($propertyName, $this->propertyTable)) { throw new Exception("Neplatný atribút \"$propertyName\"! "); } if(method_exists($this, 'get'. $propertyName)) { return call_user_func(array($this, 'get' .$propertyName)); } else { return $this->data[$this->propertyTable[$propertyName]]; } 1. if(!array_key_exists($propertyName, $this->propertyTable)
ak sa kľúč nenachádza v poli daného objektu „propertyTable“, tak vyskočí chybové hlásenie „Neplatný atribut...“ 2. if(method_exists($this, 'get'. $propertyName))
Ty si tento krok napísal ako „ tato metóda kontroluje, či TENTO( $this ) objekt má metodu s názvom „get “ s jedným „atribútom“($niečo) teda __get($niečo) A to mi príde total šialená schizofrénia metódy.
Napr ja vytvorím objekt. Síce neviem ako je to s abstraktnými triedami, tam som sa ešte nedostal. Ale: $objPropertyObject = new PropertyObject; // teraz chcem prejsť na „Janka“ $objPropertyObject->get(“Janko”); propertyTable
//ak sa nachádza, tak prechádza na ďalší krok, či objekt $objPropertyObject obsahuje vôbec metódu „get “???? „if(method_exists($this, 'get'. $propertyName)) “ Ja to vnímam takto if(method_exists($objPropertyObject, __get($propertyName))) --> toto je len moja predstava.
//Veď prvý krok bol ten, že som volal metódu „ get “ Tam by mi prišla ta kontrola k niečomu, že pred volaním si skontrolujem, či daný objekt obsahuje metódu "get ". Namiesto toho daná kontrola prichádza až po tom, čo sa už nejakú dobú vykonáva skript metódy „get “ objektu $objPropertyObject . A v tom momente ho idem dodatočne kontrolovať, tam nikdy nemôže byť "false",
|
||
Joker Profil |
#6 · Zasláno: 23. 12. 2012, 15:20:26
emissary:
„ak sa kľúč nenachádza v poli daného objektu ‚propertyTable‘, tak vyskočí chybové hlásenie ‚Neplatný atribut...‘“ Přesněji řečeno se vyhodí výjimka. „kontroluje, či TENTO($this) objekt má metodu s názvom ‚get‘ s jedným ‚atribútom‘($niečo) teda __get($niečo)“ Ne. if(method_exists($this, 'get'. $propertyName)) Čili v uvedeném příkladu, když volám get("Janko") se kontroluje, jestli objekt má metodu jménem getJanko. Pokud ano, tak ji zavolá a vrátí její výsledek. Pokud ne, tak se podívá do svého atributu propertyTable na hodnotu propertyTable["Janko"], výsledek to použije jako klíč pro svůj jiný atribut data a hodnotu vrátí. |
||
Lamicz Profil |
emissary:
To je abstraktní třída, tzn. tu třídu podědíš (např. PropertyUser extends PropertyObject) a napíšeš svoje tzv. gettery (getNeco metody podle sloupců), naplníš proměnné (jsou protected) daty a vytvoříš objekt (new) podle toho, co chceš validovat. Pak $this z této třídy se vztahuje i na potomky. Tak to chápu já, je to v podstatě něco jako validátor modelů, kde každý model (DB tabulka) má svou třídu, která dědí tu abstraktní a volá validate metodu (proto je public). |
||
Časová prodleva: 8 let
|
|||
Lamicka Profil |
#8 · Zasláno: 27. 4. 2021, 13:27:43
tiez to moc nechapem asi je ta knizka na mna moc. je to z knihy Professional PHP6 a priklad 3.
Ten sa da cely stiahnut a pozriet tu. media.wiley.com/product_ancillary/95/04703950/DOWNLOAD/395097_Code_for_Download.zip Chr03 class.PropertyObject.php rozumiem na co to sluzi ale ako to presne funguje zial neviem pochopit. :-)... |
||
Časová prodleva: 3 roky
|
0