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 :

executer une fonction dynamiquement


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Par défaut executer une fonction dynamiquement
    Bonjour, je cherche à exécuter dynamiquement une fonction venant d'une classe suivant un nom spécifique.
    En gros j'ai une classe plugins qui est charger d'exécuter suivant le nom (argument get) un script php.
    En gros j'ai essayer sa :
    Je suis dans la classe plugins
    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
    function execute_plugins($className){
    		if(isset($this->getplugin)){
    			$class = new $className;
    			return $class->run;
    		}
    	}
    	/**
    	 * Affiche la page index du plugin suivant le nom
    	 */
    	function display_plugins(){
    		if(isset($this->getplugin)){
    			$plugin = parent::s_plugins_page_index($this->getplugin);
    			self::execute_plugins(backend_plugins_.$plugin['pname']);
    		}
    	}
    Je dois exécuter la fonction execute plugins qui ne fais qu'instancier dynamiquement la classe demander et execute la fonction run contenue dans l'autre classe.
    Ah oui toutes les classes commence par backend_plugins_......
    Pour le moment sa fonctionne pas (je m'en doutais), auriez vous des conseils et surtout une orientation pour pas me prendre un gros râteau ou plutôt un écrasement de notre cher éléphant

  2. #2
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Je ne vois pas trop où est le problème, en admettant que parent::s_plugins_page_index() fonctionne est que $this->getplugin est vrai.

    Néanmoins, tu appelles self::execute_plugins(), il s'agit donc d'un call static, or execute_plugins() utilise $this->getplugin qui est une variable d'instance (et non pas une variable static)

    En imaginant que ces probs soient corrigés, alors passer une chaine à execute_plugins() ne doit pas poser de problèmes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'backend_plugins_'.$plugin['pname']
    Aussi, il faut appeller $class->run() et non pas $class->run sinon php considère que run est une property et non pas une fonction

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Par défaut
    Merci metagoto,
    j'ai travailler dessus et résolu le problème, je cherche à améliorer tout sa
    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
    19
     
    	protected function execute_plugins($className){
    		try{
    			$class =  new $className;
    		}catch(Exception $e) {
    			$log = magixcjquery_error_log::getLog();
    	        $log->logfile = $_SERVER['DOCUMENT_ROOT'].'/error.log';
    	        $log->write('An error has occured :'. $e->getMessage(),__FILE__, $e->getLine());
    	        magixcjquery_debug_magixfire::magixFireError($e);
    		}
    		return $class;
    	}
    	function display_plugins(){
    		if(isset($this->getplugin)){
    			$plugin = backend_db_plugins::s_plugins_page_index($this->getplugin);	
    			$create = self::execute_plugins('backend_plugins_'.$plugin['pname']);
    			$create->run();
    		}
    	}
    Je dois maintenant tester si le plugin existe et faire en sorte que l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Warning: include(C:\wamp\www\cms\app\backend\plugins\.php) [function.include]: failed to open stream: No such file or directory in C:\wamp\www\cms\app\backend\autoload.php on line 36
     
    Warning: include() [function.include]: Failed opening 'C:\wamp\www\cms\app\backend\plugins\.php' for inclusion (include_path='.;C:\wamp\bin\php\php5.2.9-1\PEAR\') in C:\wamp\www\cms\app\backend\autoload.php on line 36
     
    Fatal error: Class 'backend_plugins_' not found in C:\wamp\www\cms\app\backend\controller\plugins.php on line 52
    ne se reproduise plus.
    En faites, si le plugin est présent et que je tape l'url, je tombe dessus avec tout ce qu'il faut.
    Par contre, si je tape l'url d'un faux plugin je génère une erreur (logique).
    Donc je vais essayer de capturer sa et arrêter le script

  4. #4
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    tu peux utiliser la fonction http://php.net/class_exists pour vérifier si la classe existe avant de l'instancier

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Par défaut
    Oui j'ai fais un file_exist puis un class_exist mais je trouve la méthode pas très propre.
    je vais voir pour améliorer, une série de test plus propre apporterai de la souplesse dans le système.
    Je vais reprendre la découpe de l'autoload pour avoir le bon chemin vers le fichier

Discussions similaires

  1. execution d'une fonction dynamique
    Par pamoq dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/01/2008, 10h56
  2. [VBA] Executer une fonction en passant son nom en argument
    Par David Guyon dans le forum Access
    Réponses: 4
    Dernier message: 05/10/2005, 19h56
  3. creation d'une fonction dynamiquement...
    Par bibile dans le forum Général Python
    Réponses: 2
    Dernier message: 04/08/2005, 10h38
  4. executer une fonction à la fermeture d'une fenêtre
    Par Oluha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/02/2005, 09h46
  5. [Reflection] Executer une fonction dont le nom est contenu dans un String
    Par christobal dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/07/2004, 15h23

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