Autor Zpráva
emissary
Profil
<?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]];
        }
Neviem presne ako funguje 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
$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
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
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”);
// teraz ten zistuje, ci sa “janko” vôbec nachádza ako „key“ v poli danej triedy 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
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))
Zkontroluje, zda objekt má metodu, jejíž název je "get" a za tím hodnota $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).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0