Forum d'entraide PHPFrance

Venez poser vos questions PHP, MySQL, HTML, CSS, Javascript, Gestion de serveurs à la communauté PHPfrance

Vers le contenu

» Masquer les résultats de la recherche

Recherche dynamique PHPfrance

  1. Effectuez une recherche, les résultats s'afficheront dynamiquement ici.

tableau d'objets de classe

Pour les allergiques au PHP procédural

tableau d'objets de classe

Messagede max4io le 27 Jan 2012, 07:05

Bonjour,

Je souhaite insérer un objet dans un tableau static afin de n'avoir qu'à le lister pour récupérer les objets.
php m'indique cette erreur :
Catchable fatal error: Object of class Pizza could not be converted to string

Merci pour votre aide


Syntaxe: [ Télécharger ] [ Masquer ]
Code php
        class Pizza
        {
                public static $tableau_pizzas = array();
       
                public $nom;
                public $prixPetite;
                public $prixGrande;
                public $base;
                public $ingredients;
       
                public function __construct($pNom,$pPrixPetite,$pPrixGrande,$pBase,$pIngredients)
                {
                        $this->nom = $pNom;
                        $this->prixPetite = $pPrixPetite;
                        $this->prixGrande = $pPrixGrande;
                        $this->base = $pBase;
                        $this->ingredients = $pIngredients;
                       
                        $this->ajoutPizza();
                }
               
                private function ajoutPizza()
                {
                        array_push(Pizza::$tableau_pizzas,$this);
                }
        }


Syntaxe: [ Télécharger ] [ Masquer ]
Code php
for($i=0;$i<count(Pizza::$tableau_pizzas);$i++)
{
        echo(Pizza::$tableau_pizzas[$i]."<br />");
}
max4io
Embryon
 
Messages: 4
Inscription: 27 Jan 2012, 07:00

Publicité

Re: tableau d'objets de classe

Messagede xTG le 27 Jan 2012, 09:32

Bah oui, ton objet n'a pas de méthode __toString() donc il est impossible de l'afficher via un echo, car cette dernière n'affiche que des chaînes de caractères.
Au mieux tu peux utiliser la fonction de debug var_dump() pour avoir un aperçu.
xTG
ViPHP
ViPHP
 
Messages: 3206
Inscription: 03 Aoû 2010, 19:12

Re: tableau d'objets de classe

Messagede max4io le 27 Jan 2012, 16:59

Comment faire donc pour récupérer tous les objets de ce tableau static et les afficher ?
max4io
Embryon
 
Messages: 4
Inscription: 27 Jan 2012, 07:00

Re: tableau d'objets de classe

Messagede max4io le 27 Jan 2012, 17:12

La démarche générale est la suivante :
Je souhaite créer des objets Pizza (alimentés par une requete SQL) que je pourrais afficher (y compris ses leurs attributs : nom, prix, tableau d'ingredients, etc) à n'importe quel moment sans avoir à refaire une requete SQL.
max4io
Embryon
 
Messages: 4
Inscription: 27 Jan 2012, 07:00

Re: tableau d'objets de classe

Messagede xTG le 27 Jan 2012, 19:02

Syntaxe: [ Télécharger ] [ Masquer ]
Code php
foreach(Pizza::$tableau_pizzas as $pizza){
  echo $pizza->nom; // et ainsi de suite pour les autres
}
xTG
ViPHP
ViPHP
 
Messages: 3206
Inscription: 03 Aoû 2010, 19:12

Re: tableau d'objets de classe

Messagede GiorgioLino le 29 Jan 2012, 23:00

Bonjour,
je souhaite répondre à ce que tu souhaites faire :
max4io a écrit:Je souhaite créer des objets Pizza (alimentés par une requete SQL) que je pourrais afficher (y compris ses leurs attributs : nom, prix, tableau d'ingredients, etc) à n'importe quel moment sans avoir à refaire une requete SQL


Etant donné ce que tu souhaite, il me semble qu'en terme de conception il serait mieux de séparer ton code en deux classes :
- une classe qui représente un pizza et que tu instancierais pour chaque nouvelle pizza.
- une autre classe qui te permettrait d'effectuer des opérations sur les pizzas. A cet effet, je pense nécessaire que tu ajoute
la propriété "id" à ton objet pizza; Cela te permettra de différencier à coup sûr (en principe) deux pizzas.

Ceci dit, certaines questions ne sont pas traitées ici mais j'ose croire que tu les gères quelque part à savoir :
- comment sont gérés la création/modification/suppression des pizzas en base de données ?
- comment comptes-tu réfléter ces modifications sur les pizzas déjà chargées dans ton tableau le cas échéant.

Trève de discours, voici du code illustrant l'implémentation que je te propose :

/**
 *    Représente une pizza récupérée et chargée via la base de données
 */
class Pizza
{
    public $id;
    public $nom;
    public $prixPetite;
    public $prixGrande;
    public $base;
    public $ingredients;

    public function __construct($pId, $pNom,$pPrixPetite,$pPrixGrande,$pBase,$pIngredients)
    {
        $this->id = $pId;
        $this->nom = $pNom;
        $this->prixPetite = $pPrixPetite;
        $this->prixGrande = $pPrixGrande;
        $this->base = $pBase;
        $this->ingredients = $pIngredients;
    }
}


/**
 *    Fournit des méthodes permettant de "traiter" des (objets) pizzas.
 */
class PizzaService
{
    public static $tableau_pizzas = array();
    
    
/**
     *    Ajoute un objet pizza au tableau de pizzas 
     */
    public static function ajouterPizza(Pizza $maPizza)
    {
        // On ajoute la pizza que si elle n'existe pas déjà (par exemple)
        // A contrario on pourrait choisir de remplacer toute entrée existante
        if(!isset(self::$tableau_pizzas[$maPizza->id])
        { 
            self
::$tableau_pizzas[$maPizza->id] = $maPizza;
        }
    }
    
    
/**
     *    Crée un nouvel objet pizza et l'ajoute au tableau
     *    Typiquement, cette fonction permettrait de charger les objets pizzas,
     *    suite à la récupération des infos en base de données.
     */
    public static function chargerPizza($pId, $pNom,$pPrixPetite,$pPrixGrande,$pBase,$pIngredients)
    {
        $pizza = new Pizza($pId, $pNom,$pPrixPetite,$pPrixGrande,$pBase,$pIngredients);
        self::ajouterPizza($pizza);
    }    
    
    
/**
     *    Affiche une liste des pizzas actuellement chargées dans le tableau
     */
    public static function listerNomsDesPizzas()
    {
        foreach(self::$tableau_pizzas as $id => $objetPizza)
        {
            echo $objetPizza->id . " : " . $objetPizza->nom . PHP_EOL; 
        
}
    }
}
 


P.S.:

Si tu utilises une version php d'au moins 5.3.0, tu as également la classe SplObjectStorage qui est toute faite et peut t'aider à faire ce que tu veux de manière élégante.
"La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information"
Albert Einstein.
GiorgioLino
Maitre du phpinfo()
 
Messages: 52
Inscription: 05 Mar 2009, 15:32
Localisation: Strasbourg

Re: tableau d'objets de classe

Messagede max4io le 31 Jan 2012, 15:37

Un grand merci pour le temps passé à analyser la structure que je souhaitais mettre en place. Ton code m'a montré une autre façon de procéder en php objet.
Je le test et je te tiens au courant de la progression des ces classes.

Encore merci
max4io
Embryon
 
Messages: 4
Inscription: 27 Jan 2012, 07:00

Re: tableau d'objets de classe

Messagede GiorgioLino le 01 Fév 2012, 00:30

@max4io

Pas de quoi.
L'orientation objet permet de faire beaucoup de choses de manière élégante (enfin...chacun a son avis).
Cependant si elle est mal mise en œuvre, elle peut aboutir à un code spaghetti.

Pour commencer une première règle de base quand on débute peut être de prendre l'habitude dans un premier temps
de ne donner à chaque classe qu'une seule responsabilité.
"La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information"
Albert Einstein.
GiorgioLino
Maitre du phpinfo()
 
Messages: 52
Inscription: 05 Mar 2009, 15:32
Localisation: Strasbourg

Re: tableau d'objets de classe

Messagede moogli le 01 Fév 2012, 21:14

Heu pour aller plus loin faudra un objet ingredient et gérer une collection d'ingredient dans les pizzas :mrgreen:

@+
Il en faut peu pour être heureux ......
moogli
ViPHP
ViPHP
 
Messages: 3177
Inscription: 06 Juil 2006, 17:23
Localisation: gwened bzh


Retourner vers PHP orienté Objet

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités

  • Publicité