PHP: Uncaught Error: Using $this when not in object context [Fermé]

Signaler
Messages postés
5
Date d'inscription
vendredi 18 décembre 2015
Statut
Membre
Dernière intervention
10 avril 2017
-
Messages postés
12631
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2020
-
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

Messages postés
1709
Date d'inscription
vendredi 6 mars 2009
Statut
Membre
Dernière intervention
24 septembre 2018
791
C'est bien une class? Car il semble que c'est impossible d'accéder à $this, donc à la class.
Messages postés
5
Date d'inscription
vendredi 18 décembre 2015
Statut
Membre
Dernière intervention
10 avril 2017

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() {
	}
Messages postés
12631
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2020
701 >
Messages postés
5
Date d'inscription
vendredi 18 décembre 2015
Statut
Membre
Dernière intervention
10 avril 2017

pourquoi ne pas nous montrer le fichier complet?
Messages postés
5
Date d'inscription
vendredi 18 décembre 2015
Statut
Membre
Dernière intervention
10 avril 2017
>
Messages postés
12631
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2020

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();
Messages postés
12631
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2020
701 >
Messages postés
5
Date d'inscription
vendredi 18 décembre 2015
Statut
Membre
Dernière intervention
10 avril 2017

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.
Messages postés
12631
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2020
701
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?
Messages postés
5
Date d'inscription
vendredi 18 décembre 2015
Statut
Membre
Dernière intervention
10 avril 2017

Alors, quelles variables faudrait-il que je mettre à leurs places?
Messages postés
12631
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2020
701 >
Messages postés
5
Date d'inscription
vendredi 18 décembre 2015
Statut
Membre
Dernière intervention
10 avril 2017

eh bien, j'ai essayé de te suggérer quelque chose, mais j'y renonce, je ne comprends rien à ton code.

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