Getter et Setter

Eléphanteau du PHP | 27 Messages

14 nov. 2009, 17:38

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

ViPHP
fab
ViPHP | 2657 Messages

14 nov. 2009, 17:51

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 :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphant du PHP | 369 Messages

14 nov. 2009, 18:05

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.

Eléphanteau du PHP | 27 Messages

15 nov. 2009, 12:15

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é.

ViPHP
ViPHP | 4674 Messages

16 nov. 2009, 18:03

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 27 Messages

16 nov. 2009, 20:39

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?

ViPHP
ViPHP | 4674 Messages

16 nov. 2009, 20:51

Qu'entends-tu par « lister les propriétés » ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 27 Messages

16 nov. 2009, 21:10

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.

ViPHP
ViPHP | 4674 Messages

17 nov. 2009, 00:40

Alors regarde de ce côté : http://php.net/oop5.iterations :-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 27 Messages

17 nov. 2009, 10:22

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!

ViPHP
ViPHP | 4674 Messages

17 nov. 2009, 11:12

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 :-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 27 Messages

17 nov. 2009, 13:00

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.

ViPHP
ViPHP | 4674 Messages

17 nov. 2009, 16:19

Est-ce qu'on peut voir le code source de Address.php s'il te plaît :-) ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 27 Messages

17 nov. 2009, 17:01

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

ViPHP
ViPHP | 4674 Messages

17 nov. 2009, 17:20

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 ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).