2010-09-28 10 views
0

J'écris du PHP. J'ai plusieurs classes qui ne déclarent aucune propriété, publique ou autre. J'ai une classe de mySQL personnalisée qui va chercher des objets de mySQL et définit les valeurs de propriétés de l'objet PHP nouvellement init'd comme si ...PHP Automatique Propriétés/Surcharge

while ($row = mysql_fetch_assoc($result)) 
{ 
    foreach($row as $key => $value) 
    { 
     $this->{$key} = $value;   
    } 
} 

Cela semble fonctionner très bien que je peux ensuite appeler lesdites propriétés partout où je vous plaît ... $this->my_auto_property etc. Je ne trouve aucun document PHP décrivant cela comme un moyen de surcharger les propriétés d'un objet de classe.

Est-ce correct? Je veux m'assurer que ce n'est pas une sorte de rétrocompatibilité qui s'évapore dans les prochaines versions de PHP.

Répondre

0

Cela ne surcharge pas les propriétés, il s'agit simplement de définir une propriété en utilisant des variables variables. La création dynamique de nouvelles propriétés a toujours été une caractéristique de PHP. Bien sûr, personne ne peut garantir qu'il ne sera pas déconseillé, mais la façon dont PHP favorise la frappe faible, je dirais que c'est peu probable.

Une alternative serait de stocker les valeurs dans un tableau et créer un __get accessor magique pour les lire, si vous voulez augmenter l'encapsulation et votre contrôle sur l'accessibilité.

+0

I seconde en utilisant accesseur surcharge pour un peu plus d'assurance avenir épreuvage. –

0

Essayez quelque chose comme ceci:

<?php 
/** 
* This class creates a dynamic shell to 
* define and set any Setter or Getter 
* 
* Example: 
* 
* $property = new DynamicProperties(); 
* $property->setFax("123-123-1234"); // set[anything here first letter upper case]("value here") 
* echo $property->getFax()."\n"; // get[anything here first letter upper case]() 
*/ 

class DynamicProperties { 
    private $properties; 

    public function __call($name, $args) { 
     if (preg_match('!(get|set)(\w+)!', $name, $match)) { 
      $prop = $match[2]; 
      if ($match[1] == 'get') { 
       if (count($args) != 0) { 
        throw new Exception("Method '$name' expected 0 arguments, got " . count($args)."\n"); 
       } 
       return $this->properties[$prop]; 
      } else { 
       if (count($args) != 1) { 
        throw new Exception("Method '$name' expected 1 argument, got " . count($args)."\n"); 
       } 
       $this->properties[$prop] = $args[0]; 
      } 
     } else { 
      throw new Exception("Unknown method $name"); 
     } 
    } 
} 
?>