Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56

    Classe con molti attributi

    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?

  2. #2
    hai provato a dare un'occhiata al metodo "magico" __get()??
    http://www.php.net/manual/en/languag...php#object.get

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    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.

    Codice PHP:
    public function setName($value)
    {
      
    $this->name htmlspecialchars(trim($value));
    }

    public function 
    setAge($value)
    {
      
    $this->age intval($value);

    Con i metodi magici non so come fare queste operazioni a seconda del tipo della variabile.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    636
    1. Implementa le regole come array associativo che ha per chiavi i nomi delle regole, e per valori delle closure.
    2. Associa a ogni property la regola che preferisci
    3. Nel setter se è definita una regola per la property che stai settando la applichi altrimenti associ alla property il valore di default.


    es.
    1.
    Codice PHP:
    $this->regole = array(
        
    "stringhe"=>function($v){return htmlspecialchars(trim($v));}
        ,
    "numeri"=>function($v){return intval($v);}

    2.
    Codice PHP:
    //associa le regole alle 50 property
    $this->tipiRegole = array(
         
    "name"=>"stringhe"
         
    ,"age"=>"numeri"

    3.
    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

  5. #5
    i controlli si fanno nel controller
    Questa volta, più che un voto.. è favoreggiamento.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    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.

    Codice 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($vFILTER_SANITIZE_NUMBER_INT);}
            );
        }
        public function 
    __set($p$v)
        {
            if(
    array_key_exists($pself::$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'
        
    );

    Mi viene questo errore: Fatal error: Access to undeclared static property: Content::$typesRules in C:\wamp\www\patterns\controller.php on line 16
    Ultima modifica di iJoker; 25-01-2014 a 13:48

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    636
    $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

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    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

  9. #9
    quello è un model non un controller..
    Questa volta, più che un voto.. è favoreggiamento.

  10. #10
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2021 vBulletin Solutions, Inc. All rights reserved.