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 :

[POO] Reference dynamique à $this [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Par défaut [POO] Reference dynamique à $this
    Bonjour,
    je développe un code qui doit me permettre selon un fichier de configuration d'appeler dynamiquement une méthode d'un objet PHP.

    Peu importe le fichier, en gros, je passe un nom de variable et le nom d'une méthode, et eventuellement une liste de parametres.

    Tout fonctionne très bien, sauf pour deux cas

    1- la pseudo variable this. Le code suivant (pour test), ne fonctionne pas et retourne "unknown this variable" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $a = "this"; // également essayé avec $a="$this"
    $b = $$a; // atendu: $a = $this
    l'erreur est provoquée dès l'instruction 2 - En utilisant call_user_func, je n'arrive pas à passer autre chose qu'une référence d'objet. Par exemple si j'ai besoin de passer comme objet qui retourne un objet, ca ne fonctionne pas. Le code serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $obj = new Request();
    $a = "obj->getRequest"; // essayé avec "$this->getRequest()"
    $b = $$a; // erreur


    Quelqu'un a-t-il une solution ?

    Pour le moment ma seule solution est d'utiliser la fonction PHP "eval", mais je ne la trouve pas très adaptée à mon cas.

    Merci !

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Te précipite pas, laisse un peu de temps pour rédiger

    Ou alors, ton problème serait peut être un souci d'accessibilité d'une méthode, en d'autre terme, il faudrait que la methode getRequest() soit static.
    Ce qui permettrait d'y accéder de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Request::getRequest();

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Par défaut
    Salut,
    non, le but est de le faire en dynamique...

    Donc effectivement, ce que je veux faire est ce que tu écris, mais sans savoir à l'avance quelle variable "objet" ni quelle methode je vais utiliser.

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Merd**, cette fois, c'est moi qui me précipite, j'ai modifié mon post au lieu de répondre

    Et une méthode static alors ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Par défaut
    Bon, voilà mon code qui fonctionne.
    Je voudrais simplement ne pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $phpEvalScript = '$object = '.$phpObj.';';
    $r = eval($phpEvalScript);
    le code qui fonctionne à tous les coups :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $phpObj = (string)$param['object']; // get object from param
    // put object reference into "$object" variable
    $phpEvalScript = '$object = '.$phpObj.';';
    $r = eval($phpEvalScript);
    if ($r != false || isset($r)==false)
    	{
    		$phpMethod = (string)$param['method'];
    		$phpMethParams = array();
     
    		// read method params if any
    		foreach ($param->children() as $chilParam){
    			$p = (string)$childParam;
    			array_push($phpMethParams,$p);
    		}
    		// call php object method
    		$phpResult = call_user_func(array($object,$phpMethod));
    		if (isset($phpResult)) $jsonVal = Zend_Json_Encoder::encode($phpResult);
    	}

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Qelle valeur (ou contenu) vaut : $phpObj ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Poo reference d'une methode a un objet stocker dans $this
    Par magicshark dans le forum Langage
    Réponses: 4
    Dernier message: 30/04/2013, 23h42
  2. [POO] affectation dynamique d'une méthode à un objet
    Par Delphi-ne dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/02/2006, 22h17
  3. [POO] Variable Dynamique de Classe
    Par CNoob dans le forum Langage
    Réponses: 5
    Dernier message: 31/01/2006, 23h05
  4. Réponses: 6
    Dernier message: 24/01/2006, 19h50
  5. [POO] Modèle objet: this inutilisable dans certains cas?
    Par vlord dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 13/08/2005, 11h41

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