2012-10-23 2 views
1

Actuellement, j'ai un objet BaseObject qui fait ORM à DB. Je me fie aux données $ privées et au setter magique et à getter pour créer un objet avec un tas de colonnes en tant que membre d'objet privé (dynamiquement). Dans la classe enfant, si je veux modifier le comportement pour définir un membre d'objet individuel, je dois surpasser parent setter et rechercher la clé. Ma question est de savoir s'il y a une meilleure façon de le faire où je pouvais remplacer seul membre de l'objet plutôt passer par __setterComment remplacer le paramètre après setter magique et getter dans php

base de l'objet Mapper qui la carte à db et créer dynamiquement tas de params privés

class Base 
{ 
    private $data = array(); 

    public function __construct(){ 
     //get columns info from db and do set 
    } 
    public function __set($key, $value){ 
     $this->data[$key] = $value;   
    } 

    public function __get($key){ 
     return isset($this->data[$key])? $this->data[$key] : null;  
    } 
} 

et classe enfant. En ce moment pour remplacer réglage des paramètres que je dois faire ce

class Child extends Base 
{ 
    public function __set($name, $value){ 
     if($name == 'dog' && $value == 'chihuahua') 
      $this->dog = 'dog bark wolf wolf'; 
     else if($name == 'cat' && $value == 'sand') 
      $this->cat = 'cat say meow meow'; 
     ... 
    } 
} 

ma question est là façon élégante de le faire, peut-être quelque chose comme ça dans la classe des enfants?

public function __set_dog($value) 
    $this->dog = 'dog bark wolf wolf'; 

public function __set_cat($value) 
    $this->cat = 'cat say meow meow'; 

le but est de faire

$animal1 = new Animal(); 
$anmial1->dog = 'pit bull'; 
$anmial1->cat= 'sand'; 

$animal2 = new Animal(); 
$anmial1->dog = 'chihuahua'; 
$anmial1->cat= 'house cat'; 
+0

Pourriez-vous passer un peu plus de texte sur ce que vous essayez d'accomplir? Je n'ai absolument aucune idée de ce que vous essayez de faire. – Jasper

+0

En ce moment j'ai un BaseObject qui fait ORM à DB. Je me fie aux données $ privées et au setter magique et à getter pour créer un objet avec un tas de colonnes en tant que membre d'objet privé (dynamiquement). Dans la classe enfant, si je veux modifier le comportement pour définir un membre d'objet individuel, je dois surpasser parent setter et rechercher la clé. Ma question est de savoir s'il y a une meilleure façon de le faire où je pourrais simplement passer outre un membre d'objet unique plutôt que de passer par __setter. Merci d'avance – user332951

+0

Si le membre de l'objet est privé, non, vous ne pouvez rien faire d'autre. –

Répondre

4

Vous pouvez vérifier dynamiquement si une méthode getter/setter classique nommé existe et l'appeler au lieu de retourner le membre de données $. Voici un exemple:

class Base { 
    public function __get($key) { 
     if (method_exists($this, $method = 'get' . ucfirst($key))) { 
      return $this->$method($key); 
     } else { 
      return isset($this->data[$key])? $this->data[$key] : null; 
     } 
    } 

    public function __set($key, $value) { 
     if (method_exists($this, $method = 'set' . ucfirst($key))) { 
      $this->$method($key, $value); 
     } else { 
      $this->data[$key] = $value; 
     } 
    } 
} 

class Animal extends Base { 
    protected $data = array('fish' => 'blublublub', 'dog' => 'woof', 'cat' => 'meow'); 

    public function getDog() { 
     return 'dog bark wolf wolf'; 
    } 

    public function getCat() { 
     return 'cat say meow meow'; 
    } 
} 

$animal = new Animal(); 
echo $animal->fish; // "blublublub" 
echo $animal->dog; // "dog bark wolf wolf" 
echo $animal->cat; // "cat say meow meow"