JeuWeb - Crée ton jeu par navigateur
[PHP] POO et preg_replace_callback - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [PHP] POO et preg_replace_callback (/showthread.php?tid=5590)



[PHP] POO et preg_replace_callback - php_addict - 26-07-2011

Bonjour

je suis en train de me faire une classe de template en php
l'un des objectifs est de pouvoir remplacer {{autre_fichier_template.tpl}} par le contenu du fichier autre_fichier_template.tpl (en sorte que dans un template on puisse inclure d'autres templates)

et je fais ceci qui semble marcher à merveille:


$this->page = preg_replace_callback( '#{{(.*)}}#isU', array($this, 'CallBack_GetFileContent'), $this->page );

mais j'aimerais comprendre pourquoi l'on fait array($this, 'CallBack_GetFileContent') c'est à dire pourquoi on passe un array avec $this

la doc dit que l'on peut utiliser comme callback soit une fonction anonyme (depuis PHP 5.3.0) ou la fonction create_function()

mais dans mon exemple il se passe quoi concrètement avec mon array($this, 'CallBack_GetFileContent') ???

bonne soirée


RE: POO et preg_replace_callback - niahoo - 26-07-2011

et bien je dirais que logiquement il faut que l'objet pointé par $this propose une méthode CallBack_GetFileContent() qui donne ce qui doit remplacer ton pattern.

c'est comme dans call_user_function, le premier argument peut être le nom d'une fonction, une lambda (5.3), ou un array avec (objet, nom_de_methode) ou (nom_de_classe, nom_de methode (qu'on peut appeller dans un contexte static))

Je serais toi, je créerais ma méthode et dedans j'y mettrais

$args = func_get_args();
var_dump($args);

pour voir ce qu'elle reçoit mais ça devrait aussi être dans la doc


RE: POO et preg_replace_callback - Ter Rowan - 26-07-2011


normalement soit tu appelles une fonction dans ton callback, soit tu appelles une méthode d'un objet

dans le cas où tu poses array($this, 'CallBack_GetFileContent')

cela veut dire que ton code correspond à l'appel de :

$this->CallBack_GetFileContent();


si tu mets un autre objet que $this, par exemple $toto

ben tu appelles

$toto->CallBack_GetFileContent();

et si tu n'envoies pas un tableau mais juste 'CallBack_GetFileContent'

alors cela veut dire que tu appelles

CallBack_GetFileContent();



le tout avec les paramètres qui vont bien et qui dépendent de la fonction initiale (ici preg_replace_callback)

je sais pas si je suis clair ^^


RE: POO et preg_replace_callback - php_addict - 26-07-2011

merci pour vos réponses vous être des As en poo

je ne suis pas certain d'avoir compris: array($this, 'CallBack_GetFileContent') est donc un objet ?


RE: POO et preg_replace_callback - ToraTora - 26-07-2011

Ton objet c'est $this et tu appelles la méthode CallBack_GetFileContent()de $this.

Comme l'a dis Ter Rowan, uu aurais pus appeler la même méthode, mais sur un autre objet :
array($toto, 'CallBack_GetFileContent')



RE: POO et preg_replace_callback - Arius Vistoon - 26-07-2011

bon, j'arrive un peu tard pour la réponse, je vais donc te dire autre chose Wink
n'oublie pas de vérifier la validité de "autre_fichier_template.tpl" surtout si c'est un template créé par l'utilisateur (qui comme on le sait, n'est pas sur a 100% d'avoir de bonne intention sur ton site). C'est d'ailleurs pour cela, que je n'utilise pas ce genre de procédé..ce qui me fait penser que j'ai un projet la dessus qui traine...


RE: POO et preg_replace_callback - niahoo - 26-07-2011

(26-07-2011, 07:39 PM)php_addict a écrit : merci pour vos réponses vous être des As en poo

je ne suis pas certain d'avoir compris: array($this, 'CallBack_GetFileContent') est donc un objet ?

non c'est bien un tableau, imagines toi que la fonction auquel tu envoies ça fait un truc du genre

(on envoie le tableau sou le nom func)

Code :
si func est une fonction,
    retourne func(match) // match étant la capture de ta regexp
sinon si func est un tableau
    si func[0] est un objet
        retourne func[0]->func[1](match)
    sinon si func[0] est une classe
        retourne func[0]::func[1](match)
error()



RE: POO et preg_replace_callback - php_addict - 26-07-2011

Merci à vous, j'ai l'impression de découvrir comment fonctionnent les templates...

(26-07-2011, 08:05 PM)Arius Vistoon a écrit : n'oublie pas de vérifier la validité de "autre_fichier_template.tpl"

quels en sont les risques et comment vérifies tu la validité du template?



RE: POO et preg_replace_callback - Arius Vistoon - 27-07-2011

(26-07-2011, 08:57 PM)php_addict a écrit : Merci à vous, j'ai l'impression de découvrir comment fonctionnent les templates...

(26-07-2011, 08:05 PM)Arius Vistoon a écrit : n'oublie pas de vérifier la validité de "autre_fichier_template.tpl"

quels en sont les risques et comment vérifies tu la validité du template?
les risques dépendent de qui écrit dans ton editeur de template..et comment.

Je ne sais pas ce que tu cherche a faire mais si par exemple, tu écris un CMS, et que tu laisse une personne "non qualifier" ou "malveillante" (c'est pareil) écrire dedans pour changer le design de l'interface (bien que la plupart des designeur sont aussi administrateur..ce qui est un tort) et bien cette personne pourrait mettre un truc du genre
{{http://www.monsitevicieux.com/mon_fichier_qui_transmettra tout ce qu'ecrit lesclients vers_mon site_mdp_y_compris_et_qui_pete_la_bd.tpl}} et toi tu vas gentiment mettre le contenu de son fichier dans ta page. la c'est un exemple à la louche mais je suis persuadé qu'il y a d'autre cas de figure encore plus sympas...

Pour te protéger, ben ca depend de ce que tu utilises. Mais dans tout les cas, il faut TOUJOURS vérifier que ce que l'on traite est bien ce que l'on attends à traiter.
Donc imaginons mon exemple farfelu d'au-dessus. il te suffit soit de ne pas inclure de fichier qui n’appartiennent pas à une liste de fichier que tu connais, soit/et interdire les fichiers distants (sous entendu que seul ton apache, peux acceder au répertoire en question) ou verifier que le fichier est bel et bien cher toi (ce qui n'est pas la même opération, contrairement a ce que l'on pourrait croire)

Il est egalement possible que tu ne soit pas concerner par ce que j'ai écris (car je connais pas le contexte de ta demande, c'étais juste un truc que j'ai pensais en voyant ta demande...à une epoque j'ai commencé à crée un CMS qui tourneotte on va dire et j'ai été confronté au pb car je voulais absolument que les pluging des contributeur soit totalement user-friendly..en gros, qu'il n'y ai aucun parametrage a faire, le type clique et c'est plugué ou met son plugin dans le repertoire plugin et c'est plugé..la méthode qu'il préfere..sauf que en faisant comme, ca, il fallait que je soit sur que le splugin n'allait pas tout casser dans mon zolis-code...bref, j'ai opté pour une solution de template en mode objet)




RE: POO et preg_replace_callback - php_addict - 27-07-2011

Merci pour ces éclaircissements, je vais donc être confronté à un problème de conception générale: http://www.jeuweb.org/showthread.php?tid=7852