[Résolu] - Variable inaccessible via autre fichier

- Variable inaccessible via autre fichier [Résolu] - PHP - Programmation

Marsh Posté le 28-06-2007 à 10:31:20    

Bonjour à tous,
 
Je suis en train développer un site. Je me base sur le design pattern MVC.
 
J'ai un répertoire config, models, views, controllers.
Dans le répertoire config, je rassemble toute la configuration comme la config pour la BDD, config du site, etc... J'ai également un fichier qui contient les messages erreurs (errorsLog.php).
 
Dans mon répertoire j'ai une classe dans lequel je fais appel à mon fichier errorsLog.php via un include_once() puis dans mes méthodes, je déclare mon tableau contenant les messages d'erreurs : global $errors;
 
Jusqu'à présent tout fonctionnait. Puis hier soir, j'ai voulu changer le nom du tableau en $lang et le nom du fichier errorsLog.php en lang.php. Et depuis, plus aucun affichage.
J'ai fait un echo dans mon fichier lang.php : j'ai bien accès au tableau mais quand je fais un echo dans ma classe, plus rien ne s'affiche.
J'ai rien modifié en dehors des noms.
 
 
Est-ce que cela vous est déjà arrivé ? Si oui, pourquoi ca me fait ca ?
Merci pour votre aide.

Message cité 1 fois
Message édité par AlphaZone le 03-07-2007 à 12:12:19

---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 28-06-2007 à 10:31:20   

Reply

Marsh Posté le 28-06-2007 à 11:58:02    

Dans un deuxième site que je développe, j'ai procédé de la même façon, c'est à dire que j'ai appelé la fonction include_once pour inclure un fichier et lorsque j'ai utilisé global $maVar dans l'une des méthodes, celle-ci ne contenait rien.
 
J'ai décidé placer mon fichier inclut dans la méthode même, et ça fonctionne. Pas même besoin d'un global.
 
Comment se fait-il que je ne puisse pas accéder à une variable extérieur à l'intérieur de ma classe ? C'est quand même bizarre ! Normalement, en mettant global, ca devrait fonctionner, vous ne croyez pas ?  
 
Dans mon premier post, comment se fait-il que je pouvais accéder à ma variable et qu'après avoir modifier le nom, je ne pouvais plus ?
 
Merci pour ceux qui éluciderons ce mystère.


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 29-06-2007 à 10:57:44    

Comment se fait-il que ça, ça marche :
lang.php

Code :
  1. <?php
  2. $lang['OK'] = "ok ca marche";
  3. ?>


 
test.php

Code :
  1. <?php
  2. include_once('lang.php');
  3. class Test {
  4. public function run() {
  5.  global $lang;
  6.  echo $lang['OK'];
  7. }
  8. }
  9. $t = new Test();
  10. $t->run();
  11. ?>


 
Et dans le développement de mes sites, je procède de la même façon et ça ne marche pas. Pourquoi?


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 29-06-2007 à 11:14:51    

AlphaZone a écrit :

Et depuis, plus aucun affichage.
J'ai fait un echo dans mon fichier lang.php : j'ai bien accès au tableau mais quand je fais un echo dans ma classe, plus rien ne s'affiche.


 
Je suis pas sûr d'avoir bien pigé ton problème, et si en plus rien ne s'affiche, c'est pas gagné...  :sweat:  
Alors commence par activer toutes les erreurs ( error_reporting(E_ALL|E_STRICT); ), supprimer tous les opérateurs de silence que tu aurais pu mettre (les @ devant les fonctions, particulièrement les include), si besoin vérifier la config de php pour être sûr que les erreurs sont bien affichées/logguées, etc. Ca devrait permettre d'y voir plus clair.


---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 29-06-2007 à 11:36:58    

J'ai activé toutes les erreurs. J'avais quelques petits bugs. Choses résolu à 98%, j'ai un problème de date_default_timezone_set() mais bon, ce n'est pas trop grave.

 

J'ai toujours le même problème : J'ai beau essayé d'accéder à mes tableaux (déclaré dans le fichier lang.php) depuis ma classe via global, rien à faire. Aucun affichage.


Message édité par AlphaZone le 29-06-2007 à 11:37:43

---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 29-06-2007 à 23:22:34    

Aucun affichage c'est bizarre, t'es sûr que t'utilise pas l'opérateur @ avant de faire tes includes ?
Sinon j'en sais rien, ça ressemble à une erreur à la con, genre une typo dans le nom de la variable, ou dans le nom du fichier à inclure, etc.
 
Quelques pistes :
- Test l'affichage avec var_dump au lieu de echo (tu verras exactement le type)
- Vérifie que tu inclus bien le fichier dans l'espace global (et pas dans une fonction)
- Essaye d'afficher tout le tableau, pas seulement un champ
- Test si le tableau est défini avec isset
- Essaye de mettre un echo dans le fichier que tu veux inclure pour être sûr que c'est bien lui qui est inclus
- etc.


---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 02-07-2007 à 10:38:14    

cgo2 a écrit :

Aucun affichage c'est bizarre, t'es sûr que t'utilise pas l'opérateur @ avant de faire tes includes ?


Oui certain.
 

cgo2 a écrit :

Quelques pistes :
- Test l'affichage avec var_dump au lieu de echo (tu verras exactement le type)


J'essai d'afficher le type de ma variable et ca me retourne NULL
 

cgo2 a écrit :


- Vérifie que tu inclus bien le fichier dans l'espace global (et pas dans une fonction)


Toutes mes inclusions se font en global à part pour certains fichiers que je fais en local comme ceci :

Code :
  1. <?php
  2. include_once('configs/pages.php');
  3. class FrontController {
  4. public function run(){
  5.  global $pages;
  6.  $i = (!isset($_GET['p']) ||empty($_GET['p'])) ? 0 : (integer)$_GET['p'];
  7.  if (array_key_exists($i, $pages)) {
  8.   $Controller = $pages[$i].'Controller';
  9.   include('controllers/'.$Controller.'.php');
  10.   $ctrl = new $Controller();
  11.   $ctrl->run();
  12.  } else {
  13.   header('location: empresa.html');
  14.   exit;
  15.  }
  16. }
  17. }
  18. ?>


Tu crois que ca viendrais de ca ?
 

cgo2 a écrit :


- Essaye d'afficher tout le tableau, pas seulement un champ


Déjà essayé. Sans résultat.
 

cgo2 a écrit :


- Essaye de mettre un echo dans le fichier que tu veux inclure pour être sûr que c'est bien lui qui est inclus
- etc.


Déjà fait.


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 02-07-2007 à 15:08:50    

et si tu fais un echo de $GLOBALS["lang"]["OK"]?

Reply

Marsh Posté le 02-07-2007 à 15:11:23    

Rien à faire :'(


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 02-07-2007 à 15:19:09    

AlphaZone a écrit :

Toutes mes inclusions se font en global à part pour certains fichiers que je fais en local comme ceci :

Code :
  1. <?php
  2. include_once('configs/pages.php');
  3. class FrontController {
  4. public function run(){
  5.  global $pages;
  6.  $i = (!isset($_GET['p']) ||empty($_GET['p'])) ? 0 : (integer)$_GET['p'];
  7.  if (array_key_exists($i, $pages)) {
  8.   $Controller = $pages[$i].'Controller';
  9.   include('controllers/'.$Controller.'.php');
  10.   $ctrl = new $Controller();
  11.   $ctrl->run();
  12.  } else {
  13.   header('location: empresa.html');
  14.   exit;
  15.  }
  16. }
  17. }
  18. ?>


Tu crois que ca viendrais de ca ?


 
Je ne sais pas, quel est le rapport entre ce bout de code et l'inclusion de ton fichier lang.php ? Je ne comprends pas, je ne le vois pas dans l'exemple.


---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 02-07-2007 à 15:19:09   

Reply

Marsh Posté le 02-07-2007 à 15:21:36    

Ce bout de code inclut d'autres pages qui elles font appels à la page lang.php
 
Voici la page appélée qui inclut le fichier lang.php :

Code :
  1. <?php
  2. include_once('views/FrontView.php');
  3. include_once('configs/lang.php');
  4. class ContactoView extends FrontView {
  5. public function displayContacto(){
  6.  global $info;
  7.  $this->setVar('nome', htmlentities($info['nome']));
  8.  $this->setVar('morada', htmlentities($info['morada']));
  9.  $this->setVar('districto', htmlentities($info['districto']));
  10.  $this->setVar('localidade', htmlentities($info['localidade']));
  11.  $this->setVar('telefone', htmlentities($info['telefone']));
  12.  $this->setVar('fax', htmlentities($info['fax']));
  13.  $this->setVar('email', htmlentities($info['email']));
  14.  $this->displayPage('contacto');
  15. }
  16. }
  17. ?>


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 02-07-2007 à 17:20:02    

AlphaZone a écrit :

Ce bout de code inclut d'autres pages qui elles font appels à la page lang.php


 
Ce qui fait que, au final, si je comprend bien, "lang.php" est inclu par une fonction ?
 
 


---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 02-07-2007 à 17:40:53    

En gros, OUI.
 
Sauf que, avant, je n'avais aucun problème. Je me suis juste amusé à renommer mon fichier et mon tableau. Depuis, PAF! Plus rien.
 
Et cette "bizarrerie" est revenu lorsque j'ai crée un deuxième site. Cette fois, ca me là fait dès la première exécution.


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 02-07-2007 à 17:59:00    


 
Alors c'est une simple question de portée de variables. Pour vérifier, essaye de définir ton tableau avec $GLOBALS['lang'] au lieu de $lang.


---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 02-07-2007 à 18:08:07    

Ok, je test ça ce soir. Je te tiens au courant. Merci pour ton aide.


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 03-07-2007 à 12:11:54    

J'ai trouvé remède à mon problème.
 
J'ai inclus mon fichier lang.php dans ma page FrontController.php (page qui gère les sous-controllers) en global. Dorénavant, ça fonctionne :)
 
Merci pour toutes les infos, ça m'a permit d'avoir un peu de recul sur la chose.


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed