Ho un classe con numerosi attributi, e avere 50 metodi get e 50 metodi set risulta abbastanza scomodo, c'è un modo per evitare di avere tutti questi metodi?
Ho un classe con numerosi attributi, e avere 50 metodi get e 50 metodi set risulta abbastanza scomodo, c'è un modo per evitare di avere tutti questi metodi?
hai provato a dare un'occhiata al metodo "magico" __get()??
http://www.php.net/manual/en/languag...php#object.get
Ok, fin qui ci ero quasi arrivato, però a questo punto non so come gestire la sicurezza.
Ogni variabile veniva "filtrata" nella rispettiva set a seconda che fosse una stringa o un intero.
Con i metodi magici non so come fare queste operazioni a seconda del tipo della variabile.Codice PHP:
public function setName($value)
{
$this->name = htmlspecialchars(trim($value));
}
public function setAge($value)
{
$this->age = intval($value);
}
- Implementa le regole come array associativo che ha per chiavi i nomi delle regole, e per valori delle closure.
- Associa a ogni property la regola che preferisci
- Nel setter se è definita una regola per la property che stai settando la applichi altrimenti associ alla property il valore di default.
es.
1.
2.Codice PHP:
$this->regole = array(
"stringhe"=>function($v){return htmlspecialchars(trim($v));}
,"numeri"=>function($v){return intval($v);}
)
3.Codice PHP:
//associa le regole alle 50 property
$this->tipiRegole = array(
"name"=>"stringhe"
,"age"=>"numeri"
)
Codice PHP:
public function __set($p, $v){
if(array_key_exists($p, $this->tipiRegole){
$this->$p = $this->regole[$this->tipiRegole[$p]]($v);
}
else $this->$p = $v; //non applicare nessun filtro
}
Ultima modifica di longilineo; 25-01-2014 a 02:29
i controlli si fanno nel controller
Questa volta, più che un voto.. è favoreggiamento.
Grazie ragazzi, sono ancora agli inizi con i patterns e mi sono bloccato a questo punto:
Visto che ho diversi oggetti che hanno un comportamento comune, ho pensato di fare una classe e di estenderla in questo modo. Peccato che non funziona.
Mi viene questo errore: Fatal error: Access to undeclared static property: Content::$typesRules in C:\wamp\www\patterns\controller.php on line 16Codice PHP:
abstract class Content
{
private $data;
private $rules;
public function __construct()
{
$this->rules = array(
'string'=> function($v){return htmlspecialchars(trim($v));},
'int' => function($v){return filter_var($v, FILTER_SANITIZE_NUMBER_INT);}
);
}
public function __set($p, $v)
{
if(array_key_exists($p, self::$typesRules))
$this->data[$p] = $this->rules[self::$typesRules[$p]]($v); //ERRORE QUI
}
public function __get($p)
{
return $this->data[$p];
}
}
class Film extends Content
{
private static $typesRules = array(
'title' => 'string',
'year' => 'int'
);
}
class Actor extends Content
{
private static $typesRules = array(
'name' => 'string',
'surname' => 'string',
'born_year' => 'int'
);
}
Ultima modifica di iJoker; 25-01-2014 a 13:48
$typeRules dovrebbe essere almeno protected altrimenti non puoi accedervi da un'altra classe.
self non è la classe che estende ma l'abstract class Content.
Al posto di self usa static.
Dai un'occhiata qui:
http://php.net/lsb
Ultima modifica di longilineo; 25-01-2014 a 14:57
Ok grazie!
Possiamo dire che questa è una buona applicazione del pattern controller?
Oppure, anche se è funzionante, non rientra nelle "best practices" della OOP?
Ultima modifica di iJoker; 25-01-2014 a 15:18
quello è un model non un controller..
Questa volta, più che un voto.. è favoreggiamento.
Posso? ammazza che schifo l'uso di __get e __set... è una cosa che non sopporto e non sUpporta neanche l'ide che infatti non ti suggerirà mai nulla. non vedo che problema ci fosse a scrivere i get e i set, tanto quelli una volta si fanno e poi non si toccano praticamente piu. Non capisco poi perchè fare i controlli nel set, scomodi e inutili: i controlli si fanno lato validazione. Ovvero prendi il model, lo riempi, lo passi ad un validatore che lo valida (facendo anche il sanitize dei campi se vuoi) e ritorna al programma il responso (model valido o meno). Facendo come fai te, come faccio a sapere che il model sia valido per le regole che gli ho messo?
IP-PBX management: http://www.easypbx.it
Old account: 2126 messages
Oldest account: 3559 messages