| 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: 5 let
|
|||
0