8797 sujets

Développement web côté serveur, CMS

Salut ^^

A nouveau, je viens avec un problème simple, mais après plus d'une heure à chercher, j'abandonne...

A l'heure actuelle dans mon code, les fonctions pour charger des données revoient au code appelant une ressource mysql brute, celle-ci est parfaitement utilisable. Un simple while avec un fetch me crée un tableau qui me permet de créer un nouvel objet puis de lui assigner les données. Le tout très simplement.

A part que ça me semblerait mieux que tant qu'à charger les cartes, la class "GestionCarte", puisse me faire directement les objets.

Pour la version où je ne charge qu'une seule carte, ça passe tout seul. Mais quand j'ai voulu faire la version qui me les charge toute... bah ça passe plus du tout... J'ignore tout simplement comment je peux faire pour retourner plusieurs objets, si c'est possible bien sûr...

class GestionCarte
{
	public static function Charger($id)
	{
		//forcer le passage de $id en entier (via intval)
		//Récupération de données sur la table avec un WHERE
		$id=intval($id);
		$rq="select * from carte_global where ID=".$id."";
		$ressource=Sql::requeteReponse($rq);
		$mysql = $ressource->fetch_assoc();
		$carte = new Carte;
		$carte = AssignerCarte($mysql);
		return $carte;
	}
	public static function ChargerToutes($id)
	{
		//Récupération de toutes les cartes via les tables
		$rq="select * from carte_global";
		$ressource=Sql::requete($rq);
		return $ressource;
	}
}


class Carte
{
	private $ID;
	private $Nom;
	private $Largeur;
	private $Hauteur;
	private $Altitude;
	private $Niveau_min;
	
	public function AssignerCarte(array $arr)
	{
		//permet d'assigner les valeurs aux attributs à partir d'un array : $arr['ID'], $arr['Nom'], $arr['Largeur'], $arr['Hauteur'], $arr['Altitude'].
		//Ces valeurs sont issues d'un formulaire et formater en tableau ou issus de la classe GestionCarte;
		foreach ($arr as $key => $value) {
			$this->$key = $value;
		}
		unset($arr);
	}
	public function AssignerChamps($champs,$valeur)
	{
		if($champs!='Nom')
		{
			if(filter_var($valeur, FILTER_VALIDATE_INT)&&$valeur>0)
			{
				$this->$champs=$valeur;
			}
		}
		else
		{
			$this->$champs=$valeur;
		}
	}
	public function RetourAttribut()
	{
		foreach($this as $key => $value) {
			$arr[$key]=$value;
		}
		return $arr;
	}
}
Salut,

À chaque fois que je vois t'es questions sur la POO je me demande comment tu as pu posté un code qui n'est même pas interpréter convenablement…


$carte = new Carte; //ok
$carte = AssignerCarte($mysql); //appel une fonction
return $carte; // rerour de la fonction, new Carte à été inutile

au lieu de :

$carte = new Carte; //ok
$carte->AssignerCarte($mysql); //appel une methode de la classe Carte
return $carte; // rertourne la carte


Le nom de la variable $mysql est fausse, c'est un tableau tout ceux qu'il a y de plus basique. En la voyant on pense à ressource mysql…

Pour retourner plusieurs objects : un tableau (ou un objet iterable)
Ce n'est pas pars que tu fais de la POO qu'il faut bannir les tableaux.

Et ajouter une fonction intermédiaire une pour construire la carte. Fonction appelée par Charger et ChargerToutes.


class GestionCarte
{
	public static function ResourceToCarte($resource)
	{
		$carte = new Carte;
		...
		return $carte;
	}

	public static function Charger($id)
	{
		$resource  = ...
		$carte = self::ResourceToCarte($resource);
		return $carte;
	}
	public static function ChargerToutes()
	{
		$resources  = ...
		$cartes = array()
		foreach ($resource as $resources)
			$cartes[] = self::ResourceToCarte($resource);
		return $cartes;
	}
}

Modifié par jo_link_noir (17 Aug 2012 - 21:04)
jo_link_noir a écrit :
Salut,

À chaque fois que je vois t'es questions sur la POO je me demande comment tu as pu posté un code qui n'est même pas interpréter convenablement…


$carte = new Carte; //ok
$carte = AssignerCarte($mysql); //appel une fonction
return $carte; // rerour de la fonction, new Carte à été inutile

au lieu de :

$carte = new Carte; //ok
$carte->AssignerCarte($mysql); //appel une methode de la classe Carte
return $carte; // rertourne la carte


Le nom de la variable $mysql est fausse, c'est un tableau tout ceux qu'il a y de plus basique. En la voyant on pense à ressource mysql…

Pour retourner plusieurs objects : un tableau (ou un objet iterable)
Ce n'est pas pars que tu fais de la POO qu'il faut bannir les tableaux.

Et ajouter une fonction intermédiaire une pour construire la carte. Fonction appelée par Charger et ChargerToutes.


class GestionCarte
{
	public static function ResourceToCarte($resource)
	{
		$carte = new Carte;
		...
		return $carte;
	}

	public static function Charger($id)
	{
		$resource  = ...
		$carte = self::ResourceToCarte($resource);
		return $carte;
	}
	public static function ChargerToutes()
	{
		$resources  = ...
		$cartes = array()
		foreach ($resource as $resources)
			$cartes[] = self::ResourceToCarte($resource);
		return $cartes;
	}
}
Ah si les tableaux peuvent accueillir des objets, ça change tout à vrai dire... J'avais cru lire quelque part que c'était pas possible, raison pour laquelle j'ai bannie cette possibilité. (en même temps, comme pas mal de ressources sur internet date de php4 et signale même pas, ça aide pas Smiley sweatdrop )


pour le $mysql, c'est une convention toute personnelle que j'utilise depuis que j'ai commencé à m'indiquer et ça m'indique non pas une ressource sql (que j'appelle $ressource), mais un tableau issus du mysql ce qui m'évite de chercher sa déclaration et me permet de savoir que le nom des champs ce sont les noms de ma tables vu que, sauf cas rares, je n'utilise pas les AS...


Et pour le code, c'est parce que je tâtonne, donc je réfléchis à un truc, je le code et tout en le codant, je pense déjà au suivant. Là en l'occurrence, j'étais entrain de coder pour 1 seule carte tout en me demandant déjà comment j'allais pouvoir adapter ça pour le code en-dessous.

Ce qui fait que j'ai posté le code brut juste après avoir achevé sa rédaction et avant la phase de relecture.


Sinon merci pour la réponse et aussi pour la fonction pour passer de ressource à carte, j'y avais pas pensé ^^
Les tableaux en PHP c'est une sorte de couteau suisse ! On peut faire plein de choses avec et PHP les fait bien.
Pour ta classe GestionCarte : pour ma part j'ai l'impression qu'elle n'a pas lieu d'exister, toutes ses méthodes concernent les cartes. Par conséquent son corps devrait se retrouver dans la classe carte.

PS: On peut avoir des méthodes statique et des méthodes non statiques dans la même classe pas besoin de créer deux classes pour cela.
Su4p a écrit :
Les tableaux en PHP c'est une sorte de couteau suisse ! On peut faire plein de choses avec et PHP les fait bien.
Pour ta classe GestionCarte : pour ma part j'ai l'impression qu'elle n'a pas lieu d'exister, toutes ses méthodes concernent les cartes. Par conséquent son corps devrait se retrouver dans la classe carte.

PS: On peut avoir des méthodes statique et des méthodes non statiques dans la même classe pas besoin de créer deux classes pour cela.

L'intérêt est plutôt de séparer la partie "représentation" (class Carte) et la partie "Gestion" (class GestionCarte).

Entre autre, le site du Zéro d'ailleurs : Tutoriel de la POO en PHP, Manipulation de données stockées

SiteduZero a écrit :
Un objet instanciant une classe comme Personnage a pour rôle de représenter une ligne présente en BDD. Le verbe représenter est ici très important. En effet, représenter est très différent de gérer. Une ligne de la BDD ne peut pas s'auto-gérer ! C'est comme si vous demandiez à un ouvrier ayant construit un produit de le commercialiser : l'ouvrier est tout-à-fait capable de le construire, c'est son rôle, mais il ne s'occupe pas du tout de sa gestion, il en est incapable. Il faut donc qu'une deuxième personne intervienne, un commercial, qui va s'occuper de vendre ce produit.

Pour revenir à nos objets d'origine, nous aurons donc besoin de quelque chose qui va s'occuper de les gérer. Ce quelque chose, vous l'aurez peut-être deviné, n'est autre qu'un objet. Un objet gérant des entités issues d'une BDD est généralement appelé un manager.