portée des variables, constantes, include

Eléphanteau du PHP | 16 Messages

14 oct. 2005, 17:43

Je deviens chèvre... :(
J'ai lu et relu les explications concernant la portée des variables dans différentes situations et je coince sur un truc. Si qq peut m'aider, cela m'évitera de perdre la tête sur ce qui est probablement une c...rie de ma part.

Alors, voilà :
1. Je définis une constante dans un premier fichier appelé parametres.php

Code : Tout sélectionner

define("RACINE","http://www.monsite.com");
2. Dans un second fichier nommé menu.php, je crée un lien de ce type :

Code : Tout sélectionner

<a href="<?php print RACINE; ?>formations/filieres.php">FILIERES</a>
3. Dans une page de mon site, nommée page.php, j'appelle par include les deux fichiers précédents dont j'ai besoin :

Code : Tout sélectionner

include("parametres.php"); <html>blablabla.... <?php include(RACINE."menu.php"); ?> </html>
(J'ai simplifié pour les balises HTML mais elles y sont toutes, no problem).

Normalement, la constante RACINE devrait être remplacée par sa valeur dans le fichier page.php mais aussi dans le fichier menu.php. Or, dans tous mes tests, le mot RACINE s'affiche en dur à la place de sa valeur dans l'inclusion du fichier menu.php. Tout se passe comme si cette constante n'avait pas la portée suffisante pour être reconnue dans menu.php.
Si je redéclare RACINE comme constante dans page.php, là cela fonctionne. J'avais pourtant cru comprendre qu'un bout de code amené par un include était lu et interprété exactement comme s'il était dans le fichier qui l'a appelé.
Il y a un concept qui m'échappe et qui bien sûr, me fout tout le reste en l'air.
Quelqu'un peut-il m'expliquer ce que je ne pige pas, please ?
Cela va mieux en le disant

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 oct. 2005, 17:47

est-ce que tu as bien le include("parametres.php") dans menu.php ? On ne le voit pas mais je ne sais pas si c'est par oubli ou par omission pour la lecture
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 16 Messages

14 oct. 2005, 19:10

Ben non... Je fais un include pour paramètres et un include pour menu, dans page.php. Donc, le contenu de ces deux fichiers est présent dans page.php.
Logiquement, je ne devrais pas appeler une nouvelle fois paramètres dans le menu, sinon je vais l'incorporer deux fois ???
Cela va mieux en le disant

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 oct. 2005, 19:12

est-ce que le include("parametres.php") et bien avant le include("menu.php") ?

Parce qu'il me semble que le fichier sont exécutés au moment de l'inclusion
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 16 Messages

14 oct. 2005, 19:24

Oui, J'ai bien fait un include de parametres en premier. D'ailleurs comme test, je met le code suivant :

Code : Tout sélectionner

print RACINE;
dans page.php et je vois bien la valeur s'afficher. La constante est donc bien chargée dans page.php.
Par contre, si je fais ce même test de print dans menu.php, la constante n'est pas définie. Comme si elle restait locale à page.php. Je précise que j'appelle mes include à partir du chemin absolu de mon site.
ex :

Code : Tout sélectionner

include("http://www.monsite.com/php/parametres.php");
Je suis obligé de faire cela car j'utilise mes fichiers include dans différents dossiers du site (toutes les pages de mon site sont montées morceau par morceau, par des include, ce qui est très classique je crois.

En résumé, le problème que je rencontre, c'est que les variables utilisées dans les fichiers appelés par des include semblent se comporter comme si elles étaient locales aux morceaux de fichiers insérés par includes. J'espère que je suis clair ?
Cela va mieux en le disant

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 oct. 2005, 19:28

Essaye ça pour voir.

Je n'ai jamais mis de constantes dans un header et il est possible que ça vienne de là
include("parametres.php");
<html>blablabla....
<?php 
  $fichier = RACINE"menu.php";
  echo $fichier;
  include($fichier); ?>
</html>
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

OM_H
Invité n'ayant pas de compte PHPfrance

11 févr. 2013, 13:20

Salut. À mon avis, ton problème est celui de la session: si tu démarres le premier fichier de ton environnement par

Code : Tout sélectionner

session_start();
la portée de tes constantes s'étendra à tous les includes, et même, aux nouveaux scripts si eux aussi débutent par "session_start();". Et si ça vaut le coup dans ton contexte tu pourras aussi définir des variables de session sous la forme

Code : Tout sélectionner

$_SESSION['ma_variable'] = <valeur>
réutilisables dans tous les includes et scripts de la session, genre

Code : Tout sélectionner

<p>Salut, <?php echo $_SESSION['user_first_name'].' '.$_SESSION['user_last_name'] ?>.

ViPHP
xTG
ViPHP | 7331 Messages

11 févr. 2013, 16:22

Le souci vient de ton chemin absolu.
Il interprète le PHP et tu n'inclus que le HTML résultant comme si tu faisais un include d'un site distant.

Pourquoi d'ailleurs utiliser un chemin avec le protocole http ?
Utilises un chemin à partir de la racine de ton filesystem plutôt.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 févr. 2013, 14:06

euh ... vous avez vu que le message date de 2005 ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 229 Messages

12 févr. 2013, 20:26

lol !