Buffer et variables au sein d'une fonction

Résolu
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 - 2 juil. 2007 à 15:34
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 - 4 juil. 2007 à 18:54
Bonjour,

J'ai une classe permettant l'affichage d'un cadre plus ou moins grahique autour d'un contenu. Pour chaque chaque cadre j'appelle une méthode pour la définition du contenu que je passe en paramètre (simple string).
J'ai voulu amélioré ma méthode pour qu'elle détecte si la string passée en paramètre correspond à un fichier, et si c'est le cas, elle récupère le contenu du fichier.







public







function
SetContent(
$c





)
{
      if(is_file($c



))
      {
            ob_start



();
            require($c



);
            $c = ob_get_contents



();
            ob_end_clean



();
       }
      $this->_contents = $c


;
}


Mon problème, c'est que le contexte d'exécution du fichier inclu, c'est la méthode, et donc les variable du fichier ne sont pas initialisés.
Donc existe-t-il un moyen pour que si je fais:




$cadre





=
new





Cadre();
$i



= 10;
$cadre->SetContent('myfile.php'

);





dans myfile.php on ait $i = 10 ?

Merci d'avance
@+ Ordinastie.

9 réponses

Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
3 juil. 2007 à 18:19
Et si tu faisait
$cadre = new Cadre('Mon cadre');

$cadre->SetContent('myfile.php'  ,
get_defined_vars());

Et une redefinition des variables du 2d paramètre dans le corps de SetContent.

Flachy Joe

Ta vie t'est prêtée, fais en un cadeau.
3
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 2
4 juil. 2007 à 11:01
Bon, en regardant ce que donnait le get_defined_vars() , je me suis rendu compte d'une autre chose étonnante et j'ai l'impression que c'est pas trop normal:
la variable $GLOBALS contient déjà toutes les variables utilisées, et pas seulement celles qui doivent être en global, et c'est pas ce à quoi je m'attendais...
Donc finalement je m'en suis servi, plutot que d'avoir a passer systématiquement la fonction en get_defined_vars() paramètre.
Le code est devenu :

public
function SetContent(
$_content_)
{

      if(
is_file(
$_content_))
      {

            /* if(!$vars || !is_array($vars))
                    trigger_error('Array expected as 2nd parameter but got ' . gettype($vars) . '', E_USER_ERROR);
            */ 

            $ignore =
array(
'GLOBALS',

                                 '_ENV',

                                 'HTTP_ENV_VARS',

                                 '_POST',

                                 'HTTP_POST_VARS',

                                 '_GET',

                                 'HTTP_GET_VARS',

                                 '_COOKIE',

                                 'HTTP_COOKIE_VARS',

                                 '_SERVER',

                                 'HTTP_SERVER_VARS',

                                 '_FILES',

                                 'HTTP_POST_FILES',

                                 '_REQUEST',

                                 'HTTP_SESSION_VARS',

                                 '_SESSION',

                                 '_content_');
// sinon le path est overridé par le global si elle existe déja

            foreach(
$GLOBALS AS
$k =>
$w)

                  if(!
in_array(
$k,
$ignore))

                        global
$$k;

            ob_start();

            require(
$_content_);

            $_content_ =
ob_get_contents();

            ob_end_clean();
      }

      $this->_contents =
$_content_;
}

Any suggestions ?

@+ Ordinastie.
3
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 juil. 2007 à 18:34
Salut

global $i; avant ton require

<hr />une recherche sur exalead vous aurait peut-etre evite de poser cette question

In a dream, I saw me, drop dead...
U were there, U cried...
It was just a dream,
if I die, U won't cry, maybe, U'll be happy
0
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 2
2 juil. 2007 à 18:49
Salut,

Oui, effectivement, ça, ca marche. Mais ça marche à condition de connaître toutes les variables calculées avant et nécessitées pendant. Et quand bien même, c'est pas trop le but recherché de spécifier avant chaque utilisation de variable qu'il est en global.

Mais je suis pas spécialement convaincu que ce que je veux faire, soit faisable :)

@+ Ordinastie
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 juil. 2007 à 18:53
Salut

c'est faisable, t'as une truc qui permet de lister toutes les variables utilises, mais je ne m'en souviens plus

<hr />une recherche sur exalead vous aurait peut-etre evite de poser cette question

In a dream, I saw me, drop dead...
U were there, U cried...
It was just a dream,
if I die, U won't cry, maybe, U'll be happy
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
2 juil. 2007 à 22:50
Il existe get_defined_vars qui renvoi un tableau de toutes les variables.


Flachy Joe

Ta vie t'est prêtée, fais en un cadeau.
0
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 2
3 juil. 2007 à 11:51
Ah, j'y ai presque cru :)

Malheureusement, selon le manuel Php :



get_defined_vars() retourne un tableau multidimensionnel contenant la liste de toutes les variables définies, qu'elles soient des variables d'environnement, de serveur ou définies par l'utilisateur dans la portée d'appel de la fonction get_defined_vars().

Donc je n'ai accès qu'aux variables de la méthode. :(
Je suis de moins en moins convaincu que l'on puisse overrider le contexte d'exécution d'un fonction, alors en attendant, je fais comme ca:

Dans la classe :



public




function



StartContent()

{



      ob_start();
}












public
function EndContent()



{



      $c = ob_get_contents();





      ob_end_clean();





      $this->_contents = $c;




}



L'appel :







$cadre


=
new
Cadre(
'Mon cadre'
);





$cadre

->StartContent();


require



(
'myfile.php'
);





$cadre

->EndContent();



C'est pas vraiment ce que j'aurai voulu, mais je crois que j'ai pas trop le choix là :)
Si quelqu'un a d'autres idées, je suis preneur!




@+ Ordinastie.
0
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 2
3 juil. 2007 à 21:47
Ah ouais! Pas con, j'aurai du y penser ^^
Bon, j'essaye ça demain, je te dirai comment ça se passe :)
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
4 juil. 2007 à 18:54
$GLOBAL est défini comme un tableau superglobal regroupant toutes les variables du contexte global et donc le mot clef global (qui sert à faire corespondre une variable globale avec une variable locale ayant le même nom) n'a aucune incidence sur son contenu.

$GLOBAL contient toutes les variables définies en dehors des fonctions, même celles définient dans des inclusions et tant que ces inclusions sont faites au niveau global.

Flachy Joe

Ta vie t'est prêtée, fais en un cadeau.
0
Rejoignez-nous