2010-08-02 21 views
3

Je souhaite détecter tous les objets (classes) définis dans un fichier php (exemple: flavors.php). Le nombre d'objets sera défini de manière dynamique, donc j'ai besoin de traiter les objets disponibles avec une fonction à l'exécution jusqu'à ce que les objets soient épuisés. Une fois les objets épuisés, le programme s'arrête.PHP: Comment parcourir un nombre dynamique de classes

J'ai un contrôle total sur le code, donc s'il y a un meilleur moyen de stocker les variables, et de les garder organisées en utilisant seulement php, s'il vous plaît faites le moi savoir. En tant qu'expérience d'apprentissage, j'essaie de faire en sorte que php manipule un ensemble d'objets sans connaître le nombre ou les noms des objets qui existent à l'avance.

C'est la logique que je suis en train de code:

while(THERE ARE STILL CLASSES TO PROCESS IN FLAVORS.php) 
{ 
    $var = description_generator(CLASS_NAME SENT TO THE FUNCTION); 
    print($var); 
} 

Pour le contexte tel est le programme complet:

flavors.php 

class vanilla 
{ 
    // property declaration 
    public $color = 'white'; 
    public $price = '1.25'; 
} 

class chocolate 
{ 
    // property declaration 
    public $color = 'brown'; 
    public $price = '1.50'; 
} 

main.php 
{ 
function description_generator($class_name) 
{ 

    $selected_flavor_class = new $class_name(); 
    $flavor_color = $selected_flavor_class->flavor_color; 
    $flavor_price = $selected_flavor_class->flavor_price; 

    return "$flavor_color"."<br />"."$flavor_price"; 
} 

while(THERE ARE STILL CLASSES TO PROCESS) 
{ 
    print($var = description_generator(CLASS_NAME)); 
} 

Pour résumer, est-il un moyen de rendre le processus PHP à travers un nombre indéterminé de classes? Y a-t-il aussi une meilleure façon de créer et d'organiser des objets qui stockent plusieurs variables telles que chocolate = 'brown', '1.50' sans utiliser un simple tableau?

+0

get_declared_classes() regardez http://php.net/manual/fr/function.get-declared-classes.php –

Répondre

2

Vous pouvez utiliser le package Zend_Reflection, qui prolonge la regular Reflection API. Comme Zend Framework a une architecture use-will-will, vous n'avez pas besoin d'utiliser les autres classes. Vous n'avez pas besoin de migrer votre application vers Zend Framework et pouvez utiliser Zend_Reflection standalone.

, vous pouvez également donner vos cours d'un interface:

interface IFlavor 
{ 
    public function getName(); 
    public function getPrice(); 
    public function getColor(); 
} 

De cette façon, vous pouvez indiquer si une classe est un type de saveur, par exemple

$class->implementsInterface('IFlavor') 

Pour vous assurer que les classes du fichier sont bien Flavors. Cela rendra également votre code plus facile à maintenir car il garantira que vos saveurs ont toutes les mêmes méthodes de base et vous pouvez utiliser l'interface comme TypeHint et it is generally good practise to code against an interface.

Cependant, si les classes de saveurs ne possèdent que ces deux propriétés et n'ont aucune autre responsabilité , vous pouvez les transformer en une seule classe Flavor, au lieu d'avoir plusieurs classes différentes, par exemple

class Flavor implements IFlavor 
{ 
    protected $_name; 
    protected $_color; 
    protected $_price; 

    public function __construct($name, $color, $price) 
    { 
     $this->_name = $name; 
     $this->_color = $color; 
     $this->_price = $price; 
    } 

    // getter methods 
} 

Au lieu d'utiliser la réflexion pour trouver des classes dans votre fichier saveurs, vous pouvez simplement utiliser un fichier de configuration pour stocker les saveurs disponibles. Avoir une classe qui sait comment charger le fichier de configuration et lui donner une méthode pour init Flavors paresseux au besoin.Comme les Flavors sont effectivement Value Objects (in the DDD sense), vous n'avez pas besoin de plus d'une instance Flavor du même nom, de sorte que la classe de gestion peut également contenir toutes les instances précédemment créées et les retourner lorsqu'elles sont demandées.

+1

cela semble une excellente réponse. Je devrais être en mesure de mettre en œuvre ceci sans problème. Le Zend Framework a l'air d'être un gagnant puisqu'il est utilisé à volonté. J'apprécie également que vous ayez inclus une réponse à ma question sur une meilleure façon de stocker les données. Merci beaucoup. – JMC

+0

@acidjazz vous êtes les bienvenus – Gordon

0

Vous devez stocker la liste des arômes dans un tableau. Une fois qu'ils sont dans un tableau que vous pouvez faire une boucle à travers les processus & les

$flavours = array('vanilla', 'chocolate'); 

foreach($flavours as $flavour) { 
    echo description_generator($flavour); 
} 
2

Vous devriez jeter un oeil à token_get_all()

+0

+1 Cette solution fonctionne plutôt bien pour cette tâche. $ tokens = token_get_all (file_get_contents ('flavors.php')); Ensuite, vous pouvez utiliser quelque chose comme des expressions régulières pour trouver les noms de classes à traiter. – JMC