Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/08/2011, 20h57   #1
Invité régulier
 
kévin defives
Étudiant
Inscription : novembre 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : kévin defives
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 47
Points : 9
Points : 9
Par défaut Problème "undefined_function" avec create_function()

Bonjour,

En exécutant ce code :

Code :
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 ?
shark59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 21h45   #2
Modérateur
 
Avatar de FirePrawn
 
Homme Sébastien
Ingénieur réalisateur
Inscription : mars 2011
Messages : 776
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 24
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Ingénieur réalisateur
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 776
Points : 2 344
Points : 2 344
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.
__________________
- Avant toute chose : lire le mode d'emploi du forum et ses règles.
- avant de poster
- Je ne réponds pas aux questions techniques en MP.
FirePrawn est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 22h09   #3
Invité régulier
 
kévin defives
Étudiant
Inscription : novembre 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : kévin defives
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 47
Points : 9
Points : 9
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 :
$new_func = create_function('$matches', 'return modifyWithGeshi($matches[2], $matches[1]);');
shark59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 22h18   #4
Modérateur
 
Avatar de FirePrawn
 
Homme Sébastien
Ingénieur réalisateur
Inscription : mars 2011
Messages : 776
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 24
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Ingénieur réalisateur
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 776
Points : 2 344
Points : 2 344
Je t'invite à lire la doc sur create_function.
__________________
- Avant toute chose : lire le mode d'emploi du forum et ses règles.
- avant de poster
- Je ne réponds pas aux questions techniques en MP.
FirePrawn est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 22h22   #5
Invité régulier
 
kévin defives
Étudiant
Inscription : novembre 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : kévin defives
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 47
Points : 9
Points : 9
Déjà fait (je fais ça depuis 1 heure =x) Mais je continue... =/
shark59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 22h37   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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 :
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);
	}
}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 22h54   #7
Invité régulier
 
kévin defives
Étudiant
Inscription : novembre 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : kévin defives
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 47
Points : 9
Points : 9
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 :
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
shark59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h29.


 
 
 
 
Partenaires

Hébergement Web