IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Using $this when not in object context


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    433
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 433
    Points : 130
    Points
    130
    Par défaut [POO] Using $this when not in object context
    Bonjour j'ai une erreur "Using $this when not in object context" dans ce bout de code et je ne comprend pas (la ligne concernée est en gras) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
    	class TemplateEngine
    	{
    		private $template;
    		private $variables;
    	
    		public function __construct($template)
    		{
    			$this->template = addslashes($template);
    			$this->variables = array();
    		}
    
    		public function addVariable($variable, $content)
    		{
    			$this->variables[$variable] = $content;
    		}
    
    		...
    	}
    ?>
    Je suis bien dans un "contexte objet", j'ai bien instancié mon tableau dans le constructeur, qu'est-ce qui cloche ?

  2. #2
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    je crois que private $template; est en contradiction avec ton constructeur, il y a double emploi.

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    433
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 433
    Points : 130
    Points
    130
    Par défaut
    Même en enlevant la ligne "// $this->variables = array();" j'obtiens toujours la même erreur. Et ça veut dire quoi double emploi ? On peut pas instancier un membre de la classe dans son constructeur ?

  4. #4
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    montre nous comment tu utilises cette classe pour avoir cette erreur

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    433
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 433
    Points : 130
    Points
    130
    Par défaut
    Voici la classe en entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    <?php
    	class TemplateEngine
    	{
    		private $template; // Fichier template à utiliser, contenant les variables à substituer.
    		private $variables; // Tebleau associatif qui contiendra les variables et les valeurs à leur substituer.
     
    		public function __construct($template)
    		{
    			$this->template = addslashes($template);
    			// $this->variables = array();
    		}
     
    		// Ajouter une nouvelle variable à substituer.
    		public function addVariable($variable, $content)
    		{
    			$this->variables[$variable] = $content;
    		}
     
    		// Affiche la page 
    		public function outputModifiedPage()
    		{
    			if (file_exists($this->template))
    			{
    				// Récupération du contenu du template.
    				$modifiedPage = file_get_contents($this->template);
    				// Parcours du template et substitution des variables.
    				foreach ($this->variables as $variable)
    				{
    					$modifiedPage = preg_repalce('#${'.$variable.'}#', $this->variables[$variable], $modifiedPage);
    				}
    				echo $modifiedPage;
    			}
    			else throw new Exception('Le fichier '.$template.' n\'existe pas');
    		}
    	}
    ?>
    Voici le fichier php qui l'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php 
    	require('templateEngine.php');
    	$page = new TemplateEngine('default.tpl');
    	$page::addVariable('description', 'Page de test');
    	$page::addVariable('keywords', 'php, test, template');
    	$page::addVariable('charset','utf-8');
    	$page::addVariable('language','fr');
    	$page::outputModifiedPage();
    ?>
    Et juste au cas où voilà le fichier default.tpl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    	<head>
    		<meta name="Author" content="{$author}"/>
    		<meta name="Description" content="{$description}"/>
    		<meta name="Keywords" content="{$keywords}"/>
    		<meta http-equiv="Content-Type" content="text/html;charset={$charset}"/>
    		<meta http-equiv="Content-Language" content="{$language}"/>
    	</head>
    	<body>
    	</body>
    </html>
    En gros ce que c'est sensé faire vous l'aurez compris c'est remplacer les variables entre {$...} par les valeurs dans le fichier php.

  6. #6
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    433
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 433
    Points : 130
    Points
    130
    Par défaut
    En remplaçant les :: par des -> dans le fichier php ça fonctionne. Quelqu'un pourrait m'éclairer sur quand utiliser l'un ou l'autre ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Salut

    Il ne faut pas confondre méthode membre et méthode statique :
    • Une méthode membre (public/protected/private function toto()) s'utilise pour effectuer des traitements sur un objet instancié.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $audiA3 = new Voiture();
      $audiA3->demarrer();
    • Une méthode statique (public/protected/private static function titi()) s'utilise pour effectuer des opérations sur la classe d'objets et non pas sur un objet en particulier.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Voiture::getModelesDisponibles(); // renvoie une liste d'objets Voiture

    Donc dans ton cas tu as bien besoin d'appeler une méthode membre, vu que tu as instancié un objet de ta classe TemplateEngine. C'est donc la flèche qui est utilisée.

    Voilou


    ps : contrairement à ce que dit hornetbzz, ton $templates est parfaitement déclaré dans ta classe et initialisé dans ton constructeur.

  8. #8
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    433
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 433
    Points : 130
    Points
    130
    Par défaut
    Merci beaucoup, ça fonctionne maintenant après quelques modifications.

    Par contre je ne suis pas sûr d'avoir compris pour l'opérateur ::

    Il s'utilise pour les membres "static", c'est à dire ceux qui n'existent qu'en un seul exemplaire, quel que soit le nombres d'instances de la classe ? Par exemple un compteur d'instances justement ?

  9. #9
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    désolé

  10. #10
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par Gaetch
    Par contre je ne suis pas sûr d'avoir compris pour l'opérateur ::

    Il s'utilise pour les membres "static", c'est à dire ceux qui n'existent qu'en un seul exemplaire, quel que soit le nombres d'instances de la classe ? Par exemple un compteur d'instances justement ?
    Je ne pense pas que ce soit une question d'exemplaire.

    La déclaration "static" est faite pour définir une portée (particulière), une visibilité, on dit aussi accessibilité d'une propriété, ou d'une méthode (pour une classe).

    La définition du manuel me semble parfaite :
    -> Php5 : static
    -> L'opérateur de résolution de portée ::
    Statique
    Le fait de déclarer des propriétés ou des méthodes comme statiques vous permet d'y accéder sans avoir besoin d'instancier la classe. On ne peut accéder à une propriété déclarée comme statique avec l'objet instancié d'une classe (bien qu'une méthode statique le puisse).

    Comme les méthodes statiques peuvent être appelées sans objet, la pseudo-variable $this n'est pas disponible dans la méthode déclarée en tant que statique.

    On ne peut pas accéder à des propriétés statiques à travers l'objet en utilisant l'opérateur ->.
    A partir du moment où tu parviens à bien saisir la nuance de cette déclaration statique, de ces avantages et inconvénients du faite de cette visibilité particulière, tu ne devrais rencontrer moins de problème sur sa syntaxe.

    Attention, Php a évolué sur cette aspect à partir de Php5.3.0, ce qui peut être déroutant, et même provoquer des bugs sur un projet développé en local sur Php5.3 et un site en production sur une version antérieure, genre Php5.2.* si on y fait pas gaffe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $classname::$my_static; // Depuis PHP 5.3.0

    Aussi, la syntaxe d'une constante de classe est assez proche de celle d'une propriété statique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo UneClasse::constante; // Une constante de classe
    echo AutreClasse::$propriete; // Une propriété statique d'une classe

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Gaetch
    Il s'utilise pour les membres "static", c'est à dire ceux qui n'existent qu'en un seul exemplaire, quel que soit le nombres d'instances de la classe ? Par exemple un compteur d'instances justement ?
    C'est exactement ça. Ce que dit RunCodePhp est très juste techniquement. Les membres static peuvent être accédés (et je dirais même plus doivent être accédés) sans instancier d'objet (c'est pour ça que $this n'est pas autorisé dans ces méthodes). La question est donc à quoi ça sert, et quand l'utiliser ? Et bien comme tu dis, typiquement un compteur d'instances, ou une méthode qui va chercher des données dans une base et qui construit des instances (mon exemple d'hier Voiture::getModelesDisponibles()), ou toute méthode qui ne s'applique pas à un objet en particulier mais bien à la classe regroupant tous ces objets.

    Citation Envoyé par hornetbzz
    désolé
    T'inquiète cacahuète, on est tous là pour apprendre

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2014, 09h33
  2. [POO] Using $this when not in object context
    Par rugueux dans le forum Langage
    Réponses: 4
    Dernier message: 26/09/2011, 14h49
  3. Using $this when not in object context
    Par kate59 dans le forum Langage
    Réponses: 6
    Dernier message: 02/09/2010, 13h54
  4. Réponses: 7
    Dernier message: 16/07/2009, 08h13
  5. Fatal error: Using $this when not in object context
    Par lavande dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2008, 20h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo