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 :

Problème "undefined_function" avec create_function()


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2010
    Messages : 61
    Points : 42
    Points
    42
    Par défaut Problème "undefined_function" avec create_function()
    Bonjour,

    En exécutant ce code :

    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
    class AppModel extends Model {
     
    	/**
    	 * Retourne $texte coloré synthaxiquement grâce à l'API PHP Geshi.
    	 * Parsing de <code></code> pour la coloration;
    	 */
    	function getContentGeshi($texte){
    		return preg_replace_callback('#\<code=(.+)\>(.*)\</code\>#isU', create_function('$matches', 'return modifyWithGeshi($matches[2], $matches[1]);'), $texte);
    	}
     
    	/**
    	 * Fonction qui retourne le code $source coloré synthaxiquement grâce
    	 * à Geshi avec le language $language choisi.
    	 */
    	function modifyWithGeshi($source, $language){
    		App::import('Vendor', 'geshi/geshi');
    		return geshi_highlight($source, $language, $path);
    	}
    }
    J'obtiens cette erreur :

    Fatal error: Call to undefined function modifyWithGeshi() in C:\wamp\www\ShareYourGeekEdge\app\models\app_model.php(37) : runtime-created function on line 1

    Or, je ne vois pas du tout d'où cela proviens car ma fonction appelé dans preg_replace_callback est pourtant bien définie =/
    Mais le problème viens bien du create_function, il ne trouve pas modifyWithGeshi(). Et pourtant elle est juste en dessous...

    Pouvez vous m'aider svp ?

  2. #2
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 373
    Points
    19 373
    Par défaut
    Bonsoir,

    Si ça n'a pas changé, PHP compile de "haut en bas". Donc, dans ta première fonction, tu fais appelles à la seconde qui n'est pas encore définie par PHP.
    Inverse l'ordre des deux.

  3. #3
    Membre du Club
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2010
    Messages : 61
    Points : 42
    Points
    42
    Par défaut
    Déjà fait (et re-testé à l'instant) mais cela ne change rien. Toujours la même erreur :

    Fatal error: Call to undefined function modifyWithGeshi() in C:\wamp\www\ShareYourGeekEdge\app\models\app_model.php(46) : runtime-created function on line 1

    Voici la ligne 46 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $new_func = create_function('$matches', 'return modifyWithGeshi($matches[2], $matches[1]);');

  4. #4
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 373
    Points
    19 373
    Par défaut
    Je t'invite à lire la doc sur create_function.

  5. #5
    Membre du Club
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2010
    Messages : 61
    Points : 42
    Points
    42
    Par défaut
    Déjà fait (je fais ça depuis 1 heure =x) Mais je continue... =/

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    D'une, modifyWithGeshi est une méthode non une fonction : l'erreur est légitime.

    De deux, plutôt qu'une fonction lambda, pourquoi ne pas tout simplement utiliser array($this, 'modifyWithGeshi') directement comme callback après avoir revu le "prototype" de cette méthode (2 paramètres scalaires => 1 array - à la rigueur, il est facile de gérer les deux) ? Même avec PHP 5.3, ça me paraît mieux que d'utiliser une fonction anonyme intermédiaire.

    PS : en prime $path est indéfinie ?
    PPS : est-ce à la bonne place (Helper ?) et/ou utile en l'état (instance vs de classe vs autre) ? (à moins d'être incomplet/simplifié)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    class AppModel extends Model {
     
    	function getContentGeshi($texte){
    		return preg_replace_callback('#\<code=(.+)\>(.*)\</code\>#isU', array($this, 'modifyWithGeshi'), $texte);
    	}
     
    	function modifyWithGeshi($data){
    		App::import('Vendor', 'geshi/geshi');
    		return geshi_highlight($data[2], $data[1], $path);
    	}
    }

  7. #7
    Membre du Club
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2010
    Messages : 61
    Points : 42
    Points
    42
    Par défaut
    J'ai un peu du mal à comprendre la solution que tu proposes mais j'essaierai demain.
    En fait je ne comprend pas ce que tu veux dire par "utiliser directement l'array au lieu d'une fonction lambda ^^' Peux-tu me donner un exemple pour que je puisse visualiser ?

    Oui, path est defini par cakephp je crois.

    Edit : Je pense avoir compris ce que tu voulais dire en lisant la doc sur preg_match_callback. J'essaierais demain !

    Edit2 : Merci pour le code, je teste ca dès demain.
    Merci encore pour le temps que vous me consacrez !

    EDIT 3 :

    Cela fonctionne, merci encore, voici mon code :

    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
    20
    class AppModel extends Model {
     
    	/**
    	 * Fonction qui retourne le code $source coloré synthaxiquement grâce
    	 * à Geshi avec le language $language choisi.
    	 */
    	function modifyWithGeshi($data){	
    		App::import('Vendor', 'geshi/geshi');
    		$code = new GeSHi($data[2], $data[1]); //$data[2] = code et $data[1] = langage	
        	return $code->parse_code(); //On retourne le code parsé.
    	}
     
    	/**
    	 * Retourne $texte coloré synthaxiquement grâce à l'API PHP Geshi.
    	 * Parsing de  pour la coloration;
    	 */
    	function getContentGeshi($texte){
    		return preg_replace_callback('#\<code=(.+)\>(.*)\</code\>#isU', array($this, 'modifyWithGeshi'), $texte);
    	}
    }
    Malheureusement, la coloration syntaxique des classe PHP par Geshi n'est pas très coloré =/ Mais le problème viens peut être de chez moi. Mais ça c'est un autre problème...

    Merci encore

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

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