IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Déclaration dynamique de variables objets


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut Déclaration dynamique de variables objets
    Bonjour,

    Lorsque je créé ma classe, j'aimerais lui attribuer un certain nombre de variables (connues), mais listées dans un fichier séparé. La syntaxe que je connais est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class classe {
      public $var1;
      public $var2;
      public function __construct() {
         return;
      }
    }
    Le problème se situe au niveau des public, car j'aimerais ne pas avoir à les écrire "en dur", mais plutôt dynamiquement à partir du fichier.
    Comment procéder ?

    Merci

  2. #2
    Membre actif Avatar de Ethan 0x21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2006
    Messages : 120
    Points : 261
    Points
    261
    Par défaut
    Bonjour Anduriel,


    Tu peux utiliser la fonction eval de php afin de décrire dynamiquement ta classe :

    //TU charge les noms des champs listés dans le fichier séparé en mémoire dans un tableau, par exemple ici nom_fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $eval_text = "class classe {";
     
    $i=0;
    while($i!= sizeof($nom_fichier))
    {
     $eval_text .= "public ".$nom_fichier[$i]."\n";
     $i++;
    }
     
    $eval_text .= "..."; //Tu ajoute ici les méthodes et la fin de ta classe
     
    //Tu interprete le tout
    eval($eval_text);

  3. #3
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci pour ta réponse, j'avais pas pensé à ça!
    Par contre ça me semble pas très "propre", je sais pas ce qu'en pensent les puristes.. Peut être y a-t-il une syntaxe plus officielle?
    En tout cas ça résoudra mes soucis!

  4. #4
    Membre actif Avatar de Ethan 0x21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2006
    Messages : 120
    Points : 261
    Points
    261
    Par défaut
    Oui en effet sa fait un peut "code de gorer" mais sa a le mérite de marcher, l'autre solution mais qui change le paradigme de la class aurait été de creer un tableau associatif chargé avec les champs du fichiers lors de l'appel du constructeur, ainsi au lieu de :

    on aurait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $instanceClasse->variables["var1"]

  5. #5
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Oui exact, là j'ai aucune raison de pas faire ça, c'est juste que pour le codage, je préfère utiliser du ->var1 que ["var1"]... je sais très bête...

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Citation Envoyé par Anduriel Voir le message
    Lorsque je créé ma classe, j'aimerais lui attribuer un certain nombre de variables (connues), mais listées dans un fichier séparé.
    Pourquoi pas... M'enfin dans ce cas je t'invite à te pencher sur les traits

  7. #7
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Parfait ça!

    Edit: Bon en fait j'ai regardé mais je ne vois pas en quoi ça apport davantage sur la déclaration de telles variables.
    Finalement, j'ai simplement fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class tables
    {
    	public function __construct($tables)
    	{
    		foreach ($tables as $key => $table)
    		{
    			$this->{$key} = $table;
    		}
    	}
    }
    Et ça semble très bien fonctionner. Cependant, je m'interroge quand même sur la portée des variables (a priori elles sont bien trouvées quand je les appelle, mais j'ai pu lire qu'elle étaient seulement valable dans la classe )

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    simple : la visibilité des variables par défaut est public dans la classe où elles ont été directement définies et la portée est effectivement limitée à la classe

Discussions similaires

  1. Déclaration dynamique de variable
    Par winchester dans le forum SAP
    Réponses: 3
    Dernier message: 06/08/2012, 14h26
  2. Déclaration dynamique de variable
    Par shinigami dans le forum C
    Réponses: 28
    Dernier message: 12/02/2009, 13h01
  3. Création dynamique de variables objet
    Par Oliv- dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 19/06/2008, 18h17
  4. Réponses: 10
    Dernier message: 24/05/2007, 16h27
  5. Variables/objets dynamiques, quelques questions
    Par Crisanar dans le forum C++
    Réponses: 7
    Dernier message: 16/10/2005, 13h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo