Page 1 sur 1

tableau d'objets de classe

Posté : 27 janv. 2012, 07:05
par max4io
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

	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);
		}
	}
for($i=0;$i<count(Pizza::$tableau_pizzas);$i++)
{
	echo(Pizza::$tableau_pizzas[$i]."<br />");
}

Re: tableau d'objets de classe

Posté : 27 janv. 2012, 09:32
par xTG
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.

Re: tableau d'objets de classe

Posté : 27 janv. 2012, 16:59
par max4io
Comment faire donc pour récupérer tous les objets de ce tableau static et les afficher ?

Re: tableau d'objets de classe

Posté : 27 janv. 2012, 17:12
par max4io
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.

Re: tableau d'objets de classe

Posté : 27 janv. 2012, 19:02
par xTG
foreach(Pizza::$tableau_pizzas as $pizza){
  echo $pizza->nom; // et ainsi de suite pour les autres
}

Re: tableau d'objets de classe

Posté : 29 janv. 2012, 23:00
par GiorgioLino
Bonjour,
je souhaite répondre à ce que tu souhaites faire :
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 :

Code : Tout sélectionner

/**  *    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.

Re: tableau d'objets de classe

Posté : 31 janv. 2012, 15:37
par max4io
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

Re: tableau d'objets de classe

Posté : 01 févr. 2012, 00:30
par GiorgioLino
@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é.

Re: tableau d'objets de classe

Posté : 01 févr. 2012, 21:14
par moogli
Heu pour aller plus loin faudra un objet ingredient et gérer une collection d'ingredient dans les pizzas :mrgreen:

@+