Page 1 sur 2

Getter et Setter

Posté : 14 nov. 2009, 17:38
par toojee
Bonjour,

je souhaite utiliser les getter et setter dans php un peu comme avec flash et l'as3:
private var $_maVar;

public funtion get maVar(){ return $_maVar }
public function set maVar( $value )
{
    $_maVar = $value;
}
Cela ne fonctionne pas, mais est ce qu'en PHP quelque chose comme ça existe?
En cherchant sur les forums j'ai trouvé les __get et __set mais c'est pas très pratique, car je parse différement chaque variable de ma classe...

Re: Getter et Setter

Posté : 14 nov. 2009, 17:51
par fab
bah tu écris simplement pour chaque variable ton setter et ton getter.

Exemple
class Foo {
  protected $taille;
  protected $age;

  public function getTaille() { return $this->taille; }
  public function setTaille($value) { $this->taille = $value; }

 public function getAge() { return $this->age; }
 public function setAge($value) { $this->age = $value; }
}
Ca c'est le cas ou tu as de besoins spécifiques pour chaque variable, sinon tu peux utiliser les fonctions magiques __get et __set.
Mais dans ce que je viens de te montrer y a rien de magique c'est juste des méthodes de classes comme les autres.

Au passage tu pourrais essayer de faire un système mixte, utiliser les fonctions magiques et à l'interieur de celle ci tu cherches si pour la variable voulue il existe un getter ou setter spécifique :)

Re: Getter et Setter

Posté : 14 nov. 2009, 18:05
par FuZZyLine
Salut,
Bonjour,
je souhaite utiliser les getter et setter dans php un peu comme avec flash et l'as3:
private var $_maVar;
public funtion get maVar(){ return $_maVar }
public function set maVar( $value )
{
    $_maVar = $value;
}
Cela ne fonctionne pas, mais est ce qu'en PHP quelque chose comme ça existe?
En cherchant sur les forums j'ai trouvé les __get et __set mais c'est pas très pratique, car je parse différement chaque variable de ma classe...
En gros tu veux une assignation générique tout en ne voulant pas de __set & __get... pourtant très pratiques:
Tu as cette solution basique mais j'avoue que l'assignation setters est bien mieux: A savoir
tu peux parfaitement utiliser un tel control sur les __set... ;)
class MyClass
{
  /**
   * Assigne une valeur à la variable donnée en argument
   *
   * @value  : string, la clef 
   * @value  : mixed, valeur à assigner
   *
   * @ return : boolean
   */
   public setValue($strKeyName, $value)
   {
     /**
      * Test l'argument, limité aux chaine
      */
      if (!is_string($strKeyName )) return false;

     /**
      * Permet de filtrer la variable class
      */
      switch($strKeyName)
      { 
         case "toto":
            $this -> $strKeyName = $value;
         break;
         .
         .
         .
         default: return false;
      }
      return true;
   }

   .
   .
   .
}
Sinon, tu peux implementer la SPL via ArrayAccess.

@+ bon code.

Re: Getter et Setter

Posté : 15 nov. 2009, 12:15
par toojee
Bon j'ai testé la méthode __get et __set mais sans succès dans mon cas...
public function __get( $key )
{
        if ( property_exists( Address, "_".$key ) )
	{
		$getFunction = "get".ucwords( $key );
		return $this->$getFunction();
	}
	return null;
  }
public function __set( $key, $value )
{
	if ( property_exists( Address, "_".$key ) )
	{
		$setFunction = "set".ucwords( $key );
		$this->$setFunction( $value );
	}
}


public function getMavar( ) 
{ 
return $this->_mavar; 
}
public function setMavar( $value )
{
	if ( !is_string( $value ) ) return false; //exemple de test
	//-------------------------------------------------------
	$this->_address_title = $value;
}
Le probleme dans une autre classe je renvoit $this->maclass, je ne renvois pas les propriétés utilisé par __get et __set vu que je ne fais pas d'appel spécifique sur ses variables... Je précise que je renvoit la classe entière pour faire du class mapping avec flash, il reçoit donc le bon objet préformaté.

Re: Getter et Setter

Posté : 16 nov. 2009, 18:03
par Hywan
Hey :-),

Je crois que tu ne saisies pas bien la notion de __set et __get (qui sont des méthodes dites magiques en PHP).
Je te renvoie donc à la documentation : http://php.net/oop5.overloading.

Re: Getter et Setter

Posté : 16 nov. 2009, 20:39
par toojee
De ce que j'avais compris, si on appelle une méthode et qu'elle n'existe pas alors ces fonctions sont déclenchés.
Par contre dans mon cas, il faut lister les propriétés existante ce qui forcément ne peut pas fonctionner!

Donc existe t'il un moyen de lister des propriété mais en faisant un contrôle avant, un peu comme mon 1er exemple avec l'as3?

Re: Getter et Setter

Posté : 16 nov. 2009, 20:51
par Hywan
Qu'entends-tu par « lister les propriétés » ?

Re: Getter et Setter

Posté : 16 nov. 2009, 21:10
par toojee
Je fais du class mapping entre flash et php et la classe retourné à flash ne me renvoi que les propriétés publique (apparement).
Avant de les traiter dans flash j'aimerais que ces propriétés soit checké automatiquement dans php.

En fait, j'aimerais que la classe envoyé de flash vers php, ( la classe est recu en argument dans une fonction ) soit dès l'attribution des variables de flash à php checker et valider.

Re: Getter et Setter

Posté : 17 nov. 2009, 00:40
par Hywan
Alors regarde de ce côté : http://php.net/oop5.iterations :-).

Re: Getter et Setter

Posté : 17 nov. 2009, 10:22
par toojee
Ca avait pas mal, le problème c'est qu'il faut appeler la fonction alors que moi je retourne directement l'occurrence de la classe à flash, et il est impossible de faire la boucle dans flash car amfphp doit faire une copie, je sais pas comment, de l'objet.

Je pensais qu'il y avait un moyen simple mais apparemment je vais devoir lancer un contrôle manuel à chaque réception des données ou envoi... C'est pas dramatique du tout, mais comme dans flash la solution existe je pensais que PHP fonctionnait de la même manière!

Re: Getter et Setter

Posté : 17 nov. 2009, 11:12
par Hywan
Je n'y comprends rien du tout.
Soit ta classe est balancée dans Flash et c'est Flash qui itère, soit rien du tout. Mais comment veux-tu que PHP dise sans le savoir ce qu'il contient … Ça n'a aucun sens.

Si on revient à ton problème initiale, tu voulais des getters et setters. PHP n'en a pas (encore). Mais on a les méthodes magiques __set et __get. Maintenant, ça fonctionne très bien dans PHP. Par contre, ton histoire de transfert vers Flash peut corrompre plusieurs comportements « magiques »/dynamiques de PHP. Explique moi cette notion de transfert :-).

Re: Getter et Setter

Posté : 17 nov. 2009, 13:00
par toojee
Oui effectivement je sentais bien que j'étais faible sur l'explication^^.
Je voulais savoir effectivement si il y avait des getter setter donc la réponse est non. Maintenant il y a peu être un autre moyen.
J'explique étape par étape, prenons par exemple le cas d'une adresse postale dans un formulaire flash:

1) Dans flash, création d'une occurence Adress (monAdresse) avec les infos rentré par le client
2) Envoi de cet occurrence à php via amfphp et une fonction php dans la classe Formulaire.php par exemple.
3) Formulaire.php recoit la classe monAdresse via une fonction setAdress( Address monAdresse )

C'est à ce moment la qu'il faut que les propriètés de monAdresse soit chéckés dans PHP automatiquement. Je suppose qu'avec le mapping il prend toutes les propriètés de flash pour les faire coïncider avec celle de ma classe PHP qui donc un mirroir de la classe de flash. J'ai donc une classe Address.as dans flash et sa jumelle Address.php dans PHP. D'où mon envie d'utiliser les getter/setter

4) insertion dans la bdd de l'adresse
5) renvoi de monAdresse modifier peut etre par PHP au passage, à flash ( par exemple )

En fait quand PHP recoit monAdresse (setAdress( Adress monAdresse )) en argument il faudrait que les propriétés soient validés. Sinon je peut le faire dans la fonction setAdress avec un monAdresse->check() mais il faudra donc que je le fasse à chaque fois que je reçoit une adresse dans cette fonction ou d'en d'autre.

Re: Getter et Setter

Posté : 17 nov. 2009, 16:19
par Hywan
Est-ce qu'on peut voir le code source de Address.php s'il te plaît :-) ?

Re: Getter et Setter

Posté : 17 nov. 2009, 17:01
par toojee
La class Address n'a pas beaucoup d'élément. J'ai pas tout mis dans le test des données juste pour l'id mais tu vois l'idée
class Address
{
   var $address_id;
   var $address_title;
    var $title;
    var $name;
    var $first_name;
    var $society;
    var $phone;
    var $address1;
    var $address2;
    var $postal_code;
    var $city;
    var $country_code;
	//--------------------------------------------------------------------------------------
	var $_explicitType = "com.tungstene_design.Forms.Address";
	//--------------------------------------------------------------------------------------
	//-------------------------------------------------------------- Fonction - constructeur
	//--------------------------------------------------------------------------------------
	public function __construct(  )
	{
		NetDebug::Trace( "contruct" );
	}
	//--------------------------------------------------------------------------------------
	//--------------------------------------------------------------- Fonction - destructeur
	//--------------------------------------------------------------------------------------
	public function __destruct()
	{
        //
		NetDebug::Trace( "__destruct" );
    }
	
public function getAddressId( )
	{
		return $this->address_id;
    }
	public function setAddressId( $value )
	{
		$this->address_id = is_int($value) ? (int)$value : -1;
    }
Pour plus d'infos sur classMapping avec flash : http://www.astorm.ch/blog/index.php?pos ... moting-AS3

Re: Getter et Setter

Posté : 17 nov. 2009, 17:20
par Hywan
On dirait du PHP 4, c'est dégueulasse :-P.

Bon bah tous tes attributs sont publics. Tu as même de belles méthodes. Je ne vois pas où est le problème :
<?php

$address = // je reçois Address.

var_dump($address->getAddressId());
On a tout ce qu'il faut pour manipuler les données là, non ?