Partage
  • Partager sur Facebook
  • Partager sur Twitter

Hydrater ses objets en POO

A quoi ca sert?

Sujet résolu
20 novembre 2011 à 19:12:19

Bonjour a tous,
Je suis actuellement entrain d'apprendre la POO en php grâce au tutoriel de vyk12.
Mais voila au 3eme chapitre il nous parle d'hydrater ses objets:

Citation : vyk12

Une méthode hydratant un objet consistera à assigner des valeurs aux attributs souhaités. Pour cela, on lui fournit un tableau associatif : la clé est l'attribut et la valeur est celle de l'attribut. Il faut bien penser à contrôler ces valeurs afin que l'utilisateur ne mette pas n'importe quoi : les setters sont là pour nous !


Mais je ne comprend pas cela.
Pouvais vous me donner des informations complémentaires sur ce petit passage si vous plait?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
20 novembre 2011 à 19:15:41

Plop :)

Voici un extrait du cours sur Symfony2 par winzou :

Citation : winzou

Hydrater ? Un terme précis pour dire que le formulaire va remplir les attributs de l'objet avec les valeurs entrées par le visiteur. Faire <?php setPseudo('winzou') ?> et <?php setDate(new \Datetime()) ?>, etc., c'est hydrater l'objet Article.

Le formulaire en lui-même n'a donc comme seul objectif que d'hydrater un objet. Ce n'est qu'une fois l'objet hydraté que vous pourrez en faire ce que vous voudrez : faire une recherche dans le cas d'un objet Recherche, enregistrer en base de données dans le cas de notre objet Article, envoyer un mail dans le cas d'un objet Contact, etc. Le système de formulaire ne s'occupe pas de ce que vous faites de votre objet, il ne fait que l'hydrater.

Une fois que vous avez compris ça, vous avez compris l'essentiel. Le reste n'est que de la syntaxe à connaître.

  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2011 à 19:28:08

Pour moi, l'hydration d'un objet sert à assigner des valeurs à tes attributs de ta classe, automatiquement, c'est à dire sans devoir appeler les setters toi-même.
Par exemple :

<?php
class Test
{
	protected $titre;
	
	public function __construct($valeurs = array())
	{
		if(!empty($valeurs))
			$this->hydrate($valeurs);
	}

	public function hydrate($donnees)
        {
    	    foreach ($donnees as $attribut => $valeur)
    	    {
    		$methode = 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));
                
    		if (is_callable(array($this, $methode)))
    		{
    			$this->$methode($valeur);
    		}
    	    }
        }

	public function setTitre($titre)
	{
		$this->titre = $titre;
	}
}

$titre = 'Un titre';
$test = new Test($titre);
?>


La ligne suivante :

<?php $test = new Test($titre);


Tu vas créer ton objet, et la valeur de $titre va être assignée à ton attribut $titre automatiquement, grâce à la méthode d'hydratation. Donc, tes attributs seront automatiquement assigné, sans que tu ne doive appeler les méthodes setters toi-même.

Bon, voila je sais pas si je suis très juste, je commence aussi la POO ;)
  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2011 à 19:41:28

Merci ça y est j'ai compris, ça évite de tout faire manuellement ^^
  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2011 à 19:45:00

De rien, pour être sur que tu aies bien compris.
Le code que je t'ai donné en premier lieu revient au même que celui-ci :

<?php
class Test
{
	protected $titre;

	public function setTitre($titre)
	{
		$this->titre = $titre;
	}
}

$titre = 'Un titre';
$test = new Test;
$test->setTitre($titre);
?>


Mais, avec la méthode d'hydratation, quand tu auras beaucoups plus d'attributs à assigner, ça te fera gagné énormément de ligne de code ;)
  • Partager sur Facebook
  • Partager sur Twitter
1 février 2012 à 15:05:36

salutt!
on initialise nos variables avec un constructeur,des setters, et enfin avec l’hydrations,mais quelle est la différence entre ces trois !!??
merci d'avance ;)
  • Partager sur Facebook
  • Partager sur Twitter
1 février 2012 à 15:28:35

Citation : zero.h

salutt!
on initialise nos variables avec un constructeur,des setters, et enfin avec l’hydrations,mais quelle est la différence entre ces trois !!??
merci d'avance ;)


Ou directement en affectant les propriétés publiques de l'objet...
La différence dépend du contexte, de la nature de l'objet ou du mécanisme que l'on veut coder, le résultat étant le même à savoir modifier son état interne.

T.
  • Partager sur Facebook
  • Partager sur Twitter
1 février 2012 à 15:37:21

Citation : Tracker


Ou directement en affectant les propriétés publiques de l'objet...
La différence dépend du contexte, de la nature de l'objet ou du mécanisme que l'on veut coder, le résultat étant le même à savoir modifier son état interne.

T.


mais je pense que si nos attributs sont privés on peut pas affecter !!! pour reste est ce que tu as une exemple explicatif pour chaque façon de faire o_O^^
  • Partager sur Facebook
  • Partager sur Twitter
1 février 2012 à 15:53:18

Citation : zero.h

mais je pense que si nos attributs sont privés on peut pas affecter


Personne ne te contraint à protéger systématiquement tes propriétés, surtout pour les objet servant strictement à véhiculer des informations comme ceux issus de la base.

Des exemples o_O, ben ça dépend ce que tu codes...
- Les éléments fournis au constructeur servent à construire l'élément ex: un DSN sur une connexion à la BDD
- Des getters/setters quand l'objet est sensible
- Des méthodes type hydrate, formArray, etc... quand tu veux pour te simplifier la vie remplir plusieurs propriétés à la fois...

T..
  • Partager sur Facebook
  • Partager sur Twitter
16 février 2014 à 17:31:50

J'avoue ne pas bien comprendre l'intérêt de la fonction hydrate dans l'exemple de Link (voire son utilité en général), ne serait-il pas plus simple d'en inclure le code directement dans le construct ?

-
Edité par SeanBateman 16 février 2014 à 17:35:49

  • Partager sur Facebook
  • Partager sur Twitter
17 février 2014 à 0:01:34

Dans son exemple (qui n'a pas tout à fait correcte d'ailleurs) il n'a qu'une seule propriété et donc l'utilité d'une méthode "hydrate" est peu utile. C'est bien plus utile quand nos objets ont bien plus d'un attribut a "altérer".

Ensuite, créer une méthode séparée qui est ensuite appelée par le constructeur permet de rappeler cette méthode par la suite sans devoir ré-instancier l'objet pour de nouveau accéder à la méthode (note: bien que je pense qu'on peut appeler manuellement __construct() comme une méthode normal : $objet->__construct() ; à essayer).

  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2020 à 16:22:32 - Message modéré pour le motif suivant : Contenu erroné


8 avril 2020 à 17:41:13

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter