PHP: Uncaught Error: Using $this when not in object context

Bonjour,

je doit faire un page web en PHP qui affiche une liste d'émissions de télévision à partir d'une base de données .sqlite, mais il y a un problème:

Fatal error: Uncaught Error: Using $this when not in object context in C:\Users\utilisateur\Desktop\qcref_projet2_v2\classes\Emission.class.php:112 Stack trace: #0 C:\Users\utilisateur\Desktop\qcref_projet2_v2\classes\Emission.class.php(103): Emission::html_liste_li_array() #1 C:\Users\utilisateur\Desktop\qcref_projet2_v2\classes\Emission.class.php(203): Emission::html_liste() #2 {main} thrown in C:\Users\utilisateur\Desktop\qcref_projet2_v2\classes\Emission.class.php on line 112

voici les méthodes problématiques dans la classe émission:

voici ma méthode html_liste (permettant de faire le ul des émissions):
    static public function html_liste() {
        $SQL = "SELECT * FROM emissions";
        $pdo = Qcref::connecter();
        $req = $pdo->prepare($SQL);
        $req->execute();
        $resultat = '';
        //$resultat .= '<ul class="list">';
        while(($oEmission = $req->fetchObject('Emission')) !== false) {
            //var_dump($oEmission);
            $tEmission = get_object_vars($oEmission);
            var_dump($tEmission['slug']);
            //var_dump($tEmission);
            foreach ($tEmission as $oEmission) {
                var_dump($oEmission);
                $oEmission = self::fromArray($tEmission);
                //$oEmission->sauvegarder();
            }
            $resultat .= $oEmission->html_liste_li_array();
        }
        //$resultat .= '</ul>';
        //return $resultat;
    }

voici ma méthode fromArray (permettant de changer les propriétés de l'objet émission):
    static public function fromArray($array) {
        $resultat = new self();
        if (isset($array['id'])) {
            $resultat->id = $array['id'];
        }
        if (isset($array['titre'])) {
            $resultat->titre = $array['titre'];
        }
        if (isset($array['slug'])) {
            $resultat->slug = $array['slug'];
        }
        return $resultat;
    }

voici ma méthode html_liste_li_array (permettant de faire le li d'un émission à l'aide des propriétés de l'objet émission):
    static public function html_liste_li_array() {
        $resultat = '';
        $resultat .= '<li>';
        $resultat .= '<img src="images/emissions/'.$this->slug.'_64x64.jpg" alt="'.$this->titre.'">';
        $resultat .= '<div>';
        $resultat .= '<div class="titre">'.self::html_lienTitre_array($array).'</div>';
        $resultat .= '<div class="nbrefs">'.$array['nbrefs'].' références</div>';
        $resultat .= '</div>';
        $resultat .= '</li>';
        return $resultat;
    }


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.

Merci à tous de votre aide.

3 réponses

  1. C'est bien une class? Car il semble que c'est impossible d'accéder à $this, donc à la class.
    1. Oui c'est une classe, la preuve, au début du fichier de la classe Émission, je l'ai déclaré en tant que classe et j'ai les propriétés plus la méthode __construct...
      class Emission {
          static public $table = "emissions";
      	public $id = 0;
      	public $titre = '';
      	public $slug = '';
      	public $nbrefs = 0;
      	
      	public function __construct() {
      	}
      
    2. Contributeur
      @VekTheGamerpourquoi ne pas nous montrer le fichier complet?
    3. @yg_bed'accord, voici la classe en question:

      <?php
      include_once "Qcref.class.php";
      class Emission {
          static public $table = "emissions";
      	public $id = 0;
      	public $titre = '';
      	public $slug = '';
      	public $nbrefs = 0;
      	
      	public function __construct() {
      	}
      //	static public function getObject($slug, $prendreRefs=false) {
      //        $resultat = self::getOne($slug, PDO::FETCH_CLASS);
      //        if ($prendreRefs) {
      //            $resultat->refs = Ref::donnees("WHERE emission_id=".$resultat->id);
      //        }
      //		return $resultat;
      //	}
          static public function getObject(/*$slug, $prendreRefs=false*/) {
      		$SQL = "SELECT titre FROM emissions";
              $pdo = Qcref::connecter();
              //var_dump($pdo);
      		$req = $pdo->prepare($SQL);
              //var_dump($req);
      		$req->execute();
              //$resultat = var_dump($req);
              $enr = $req->fetchObject();
              return $enr;
      	}
      //    static public function getArray($slug) {
      //        $pdo = Qcref::connecter();
      //		$SQL = "SELECT * FROM view_emissions $WHERE ORDER BY titre";
      //		$req = $pdo->prepare($SQL);
      //		$req->execute();
      //		if (!isset($donnees[$slug])) {
      //			return false;
      //		} else {
      //			return $donnees[$slug];
      //		}
      //    }
      	/*static public function donnees($WHERE='') {
      		$pdo = Qcref::connecter();
      		$SQL = "SELECT * FROM view_emissions $WHERE ORDER BY titre";
      		$req = $pdo->prepare($SQL);
              $req->setFetchMode(PDO::FETCH_ASSOC);
      		$req->execute();
      		$resultat = self::donnees_fromReq($req);
      		return $resultat;
      	}*/
      	static public function donnees_fromReq($req) {
      		$resultat = [];
      		while (($enr = $req->fetch()) !== false) {
      			$resultat[$enr['slug']] = $enr;
      		}
      		return $resultat;
      	}
      	static public function html_article_array($array) {
      		$resultat = '';
      		$resultat .= '<article>';
      		$resultat .= '<header>';
      		$resultat .= '<h1>'.$array['titre'].'</h1>';
      		$resultat .= '</header>';
      		$resultat .= '<div class="body">';
      		$resultat .= '<div class="image">';
      		$resultat .= '<img src="images/emissions/'.$array['slug'].'.jpg" alt="'.$array['titre'].'";>';
      		$resultat .= '</div>';
      		$resultat .= '<div class="details">';
      		$resultat .= '<h3>Liste des références</h3>';
      		$resultat .= 'La liste des références vient ici';
      		$resultat .= '</div>';
      		$resultat .= '</div>';
      		$resultat .= '</article>';
      		return $resultat;
      	}
      //	static public function html_liste() {
      //		//$donnees = self::donnees();
      //		$resultat = '';
      //		$resultat .= '<ul class="list">';
      //		foreach ($donnees as $slug=>$emission) {
      //			$resultat .= self::html_liste_li_array($emission);
      //		}
      //		$resultat .= '</ul>';
      //		return $resultat;
      //	}
          
          static public function html_liste() {
              $SQL = "SELECT * FROM emissions";
              $pdo = Qcref::connecter();
      		$req = $pdo->prepare($SQL);
      		$req->execute();
      		$resultat = '';
      		//$resultat .= '<ul class="list">';
      		while(($oEmission = $req->fetchObject('Emission')) !== false) {
                  //var_dump($oEmission);
                  $tEmission = get_object_vars($oEmission);
                  //var_dump($tEmission['slug']);
                  //var_dump($tEmission);
                  foreach ($tEmission as $emissions) {
                      $oEmission = self::fromArray($tEmission);
                      var_dump($oEmission);
                      //$oEmission->sauvegarder();
      		    }
      			$resultat .= $oEmission->html_liste_li_array();
      		}
      		//$resultat .= '</ul>';
      		//return $resultat;
      	}
          
      	static public function html_liste_li_array() {
      		$resultat = '';
              $resultat .= '<li>';
              $resultat .= '<img src="images/emissions/'.$this->slug.'_64x64.jpg" alt="'.$this->titre.'">';
              $resultat .= '<div>';
              $resultat .= '<div class="titre">'.self::html_lienTitre_array($array).'</div>';
              $resultat .= '<div class="nbrefs">'.$array['nbrefs'].' références</div>';
              $resultat .= '</div>';
              $resultat .= '</li>';
      		return $resultat;
      	}
      	public function sauvegarder() {
      	}
      	/*public function toArray($array) {
      		$resultat = [];
      		$resultat['id'] = $this->id;
      		$resultat['titre'] = $this->titre;
      		$resultat['slug'] = $this->slug;
      		return resultat;
      	}*/
          static public function html_lienTitre_array($array) {
      		$resultat = '';
              $resultat .= self::html_lienDetails($this->slug, $this->titre);
              return $resultat;
          }
      	static public function html_lienDetails($slug, $contenu) {
              $resultat = '';
              $resultat .= '<a href="emissions_details.php?slug='.$slug.'" rel="nofollow noopener noreferrer" target="_blank">'.$contenu.'</a>';
              return $resultat;
          }
      	static public function fromArray($array) {
      		$resultat = new self();
      		if (isset($array['id'])) {
      			$resultat->id = $array['id'];
      		}
      		if (isset($array['titre'])) {
      			$resultat->titre = $array['titre'];
      		}
      		if (isset($array['slug'])) {
      			$resultat->slug = $array['slug'];
      		}
      		return $resultat;
      	}
      	static public function html_form() {
      		$resultat = '';
      		return $resultat;
      	}
      	static public function html_form_titre($valeur="") {
      		$resultat = '';
      		$resultat .= '<div>';
      		$resultat .= '<label for="titre">Titre : </label>';
      		$resultat .= '<input type="text" name="titre" id="titre" value="'.$valeur.'" style="width:30em;"/>';
      		$resultat .= '</div>';
      		return $resultat;
      	}
      	static public function html_form_slug($valeur="") {
      		$resultat = '';
      		$resultat .= '<div>';
      		$resultat .= '<label for="slug">Slug : </label>';
      		$resultat .= '<input type="text" name="slug" id="slug" value="'.$valeur.'" style="width:30em;"/>';
      		$resultat .= '</div>';
      		return $resultat;
      	}
      	static public function select() {
      		$pdo = Qcref::connecter();
      		$SQL = "SELECT titre, slug FROM emissions ORDER BY titre";
      		$req = $pdo->query($SQL);
      		$resultat = '';
      		$resultat .= '<select name="emission_slug" id="emission_slug">';
      		while (($enr = $req->fetch()) !== false) {
      			$resultat .= '<option value="'.$enr['slug'].'">';
      			$resultat .= $enr['titre'];
      			$resultat .= '</option>';
      		}
      		$resultat .= '</select>';
      		return $resultat;
      	}
          static public function sql_creerTable() {
      		$table = self::$table;
      		$champs[] = "id	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT";
      		$champs[] = "texte	TEXT NOT NULL";
      		$champs[] = "auteur	TEXT";
      		$champs = implode(",", $champs);		
      		$SQL = "CREATE TABLE $table ($champs);";
      		return $SQL;
      	}
          static public function sql_supprimerTable() {
      		$table = self::$table;
      		$SQL = "DROP TABLE IF EXISTS $table;";
      		return $SQL;
      	}
      }
      
      //echo Emission::getObject(/*'dexter', $prendreRefs=false*/);
      echo Emission::html_liste();
      
    4. Contributeur
      @VekTheGamerje vois une soupe bizarre avec $oEmission, $tEmission et $emission.
          static public function html_liste() {
              $SQL = "SELECT * FROM emissions";
              $pdo = Qcref::connecter();
      		$req = $pdo->prepare($SQL);
      		$req->execute();
      		$resultat = '';
      		//$resultat .= '<ul class="list">';
      		while(($oEmission = $req->fetchObject('Emission')) !== false) {
                  //var_dump($oEmission);
                  $tEmission = get_object_vars($oEmission);
                  //var_dump($tEmission['slug']);
                  //var_dump($tEmission);
                  foreach ($tEmission as $emissions) {
                      $oEmission = self::fromArray($tEmission);
                      var_dump($oEmission);
                      //$oEmission->sauvegarder();
      		    }
      			$resultat .= $oEmission->html_liste_li_array();
      		}
      		//$resultat .= '</ul>';
      		//return $resultat;
      	}
      

      je vois de multiples anomalies, en voici deux:
      tu assignes $emission en ligne 14, et tu ne l'utilises jamais.
      $oEmission est assigné en ligne 8, puis bizarrement écrasé en ligne 15.
      je suggère d'utiliser des noms plus clairs pour tes variables.
  2. Contributeur
    je suis étonné par la triple utilisation de $oEmission dans html_liste():
    une fois comme critère du while:
    $oEmission = $req->fetchObject

    une seconde fois, à l'intérieur du while, comme variable d'itération du foreach:
    foreach ($tEmission as $oEmission

    une troisième fois, à l'intérieur du foreach,
    $oEmission =

    est-ce bien raisonnable? ne vaudrait-il pas mieux utiliser trois variables différentes?
    1. Alors, quelles variables faudrait-il que je mettre à leurs places?
    2. Contributeur
      @VekTheGamereh bien, j'ai essayé de te suggérer quelque chose, mais j'y renonce, je ne comprends rien à ton code.
  3. Bonsoir

    Tu utilises $this dans html_liste_li_array qui est une méthode statique.
    Or, tu ne peux pas utiliser $this dans une méthode statique.
    Une méthode statique est prévue pour ne pas être liée à un objet particulier, et this sert à désigner l'objet courant.

    https://www.php.net/manual/fr/language.oop5.static.php