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

VekTheGamer Messages postés 6 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
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. Utilisateur anonyme
     
    C'est bien une class? Car il semble que c'est impossible d'accéder à $this, donc à la class.
    0
    1. VekTheGamer Messages postés 6 Statut Membre
       
      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() {
      	}
      
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > VekTheGamer Messages postés 6 Statut Membre
         
        pourquoi ne pas nous montrer le fichier complet?
        0
      2. VekTheGamer Messages postés 6 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        d'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();
        
        0
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > VekTheGamer Messages postés 6 Statut Membre
         
        je 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.
        0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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?
    0
    1. VekTheGamer Messages postés 6 Statut Membre
       
      Alors, quelles variables faudrait-il que je mettre à leurs places?
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > VekTheGamer Messages postés 6 Statut Membre
         
        eh bien, j'ai essayé de te suggérer quelque chose, mais j'y renonce, je ne comprends rien à ton code.
        0
  3. Utilisateur anonyme
     
    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
    0