2010-01-18 5 views
0

J'ai une méthode d'en-tête qui montre en haut d'une page, il est à l'intérieur d'une classe, dans ma méthode header() Je lance ce code ici pour lancer un nouvel objet Profiler ...Comment réparer cette erreur PHP?

//start new page timer object 
$profiler = new Profiler; 
$profiler->start(); 

Après un tas d'autres fichiers sont compilés, je puis inclure un fichier dans la section de pied de page, dans ce fichier je lance ce code,

echo 'Page Generated in ' .$profiler->end(). ' of a second with ' .$_SESSION['querie_counter']. ' MySQL Queries'; 

Cependant, je reçois ce message d'erreur dans le fichier de pied de page maintenant,

Notice: Undefined variable: profiler in C:\webserver\htdocs\friendproject2\includes\footer.inc.php on line 21

Fatal error: Call to a member function end() on a non-object in C:\webserver\htdocs\friendproject2\includes\footer.inc.php on line 21

Comment puis-je résoudre ce problème?

+2

365 Questions, bravo! –

+1

Vous avez demandé presque cette même question_exact hier: http: // stackoverflow.com/questions/2080369/can-i-have-a-class-method-include-a-header-file-for-me-in-php Qu'avez-vous pas compris? – hobodave

+2

Veuillez lire deux fois http://php.net/manual/fr/language.variables.scope.php. – hobodave

Répondre

6

Si vous avez créé l'objet $ profiler dans la méthode d'en-tête, il ne sera pas disponible dans une autre méthode, à moins qu'il s'agisse d'un global $ profiler ou d'un singleton.

Pour la rendre globale, déclare profileur $ en dehors de la méthode d'en-tête, puis dans la méthode d'en-tête, comprennent cette ligne:

global $profiler;

Inclure cette ligne dans le la méthode de pied de page ainsi. Le reste de votre code peut rester tel qu'il est. Ça devrait marcher.

3

Les variables créées dans une fonction sont locales à cette fonction. Utilisez le global keyword pour déclarer une variable globale.

0

Je suggérerais de faire de la classe $profiler une propriété de la classe principale et de l'initialiser dans la méthode constructeur, car elle n'est pas vraiment liée à l'en-tête.

En supposant qu'il est la classe principale

class Example { 
    private $profiler; 

    public function __construct() { 
     $this->profiler = new Profiler; 
    } 

    public function header() { 
     ... 
    } 
} 

Dans l'en-tête inclus, initialiser cet objet et en-tête exécuter, et juste pour le rendre plus explicite, faire l'appel de démarrage profileur séparément:

$example = new Example(); 
$example->profiler->start(); 
$example->header(); 

A l'intérieur du pied de page inclus:

$example->profiler->end(); 
0

étapes possibles:

  1. Tout d'abord assurez-vous que vous incluez le fichier qui contient la classe profileur.
  2. Si vous utilisez l'instance profileur dans une fonction, vous devez utiliser le mot-clé global:

    profileur global $;

+0

Vous vouliez dire global;) –

+0

oui c'est ce que je voulais dire: corrigé :) – Sarfraz

0

Je pense que si vous supprimez session() du haut de votre tête vos problèmes seront corrigés ...

Questions connexes