Buffer et variables au sein d'une fonction [Résolu]

Signaler
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
-
Messages postés
2083
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
15 octobre 2020
-
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

Messages postés
2083
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
15 octobre 2020
1
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.
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
2
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.
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
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
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
2
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
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
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
Messages postés
2083
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
15 octobre 2020
1
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.
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
2
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.
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
2
Ah ouais! Pas con, j'aurai du y penser ^^
Bon, j'essaye ça demain, je te dirai comment ça se passe :)
Messages postés
2083
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
15 octobre 2020
1
$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.