Quand déclarer les variables dans les classes ?

Petit nouveau ! | 1 Messages

17 oct. 2021, 10:59

Bonjour,
Je n'ai pas compris quand il faut déclarer les variables dans les classes. Dans mon exemple, je n'ai pas déclaré et cela marche très bien (j'ai mis la variable $db en commentaire) :

Code : Tout sélectionner

class Database { // protected $db; // Faut-il mettre ??? public static function connectDB() { /* Une Méthode Statique (pas besoin de faire new Database() pour y accéder) */ $db = new PDO('mysql:host=localhost; dbname=nombdd; charset=utf8', 'root', '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING, /* Active les erreurs SQL */ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC /* On récupère tous les résultats en tableau associatif indexé par Nom de colonne */ ]); return $db; } } // ============================== abstract class Model { /* abstract pour dire qu"il ne sert qu'à l'héritage. Empêche de faire new Model() */ // protected $db; // Faut-il mettre ??? public function __construct() { $this->db = Database::connectDB(); // Accès à une Méthode Statique. Connexion à la base de données } } // ============================== class Movie extends Model { // protected $db; // Faut-il mettre ??? public function findAllMovie() { $query = $this->db->query('SELECT * FROM movie ORDER BY id DESC'); $movies = $query->fetchAll(PDO::FETCH_OBJ); // En PHP Objet, ne pas oublier le paramètre PDO::FETCH_OBJ, sinon ça ne marche pas return $movies; } public function showAllMovie() { foreach ($this->findAllMovie() as $movie) { echo '<div><a href="watching.php?id='.$movie->slug.'"><img src="assets/img/'.$movie->cover.'" alt="'.$movie->title.'"></a></div>'; } } } $movie = new Movie(); $movie->showAllMovie();

Eléphant du PHP | 82 Messages

21 janv. 2022, 21:35

 class Database {
 // protected $db; // Faut-il mettre ???
 public static function connectDB() { /* Une Méthode Statique (pas besoin de faire new Database() pour y accéder) */
 $db = new PDO('mysql:host=localhost; dbname=nombdd; charset=utf8', 'root', '', [
 PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING, /* Active les erreurs SQL */
 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC /* On récupère tous les résultats en tableau associatif indexé par Nom de colonne */
 ]);
 return $db;
 }
 }
 
Tu utilises la variable local $db donc ca ne génère pas d'erreur vu que tu ne l'utilises pas.
 abstract class Model { /* abstract pour dire qu"il ne sert qu'à l'héritage. Empêche de faire new Model() */
 // protected $db; // Faut-il mettre ???

 public function __construct() {
 $this->db = Database::connectDB(); // Accès à une Méthode Statique. Connexion à la base de données
 }
 }
 
 // ==============================
 
Ici il doit être déclaré. Je pense que cela ne génére pas d'erreur ca tu l'écris dès la construction de l'objet.
 class Movie extends Model {
 // protected $db; // Faut-il mettre ???

 public function findAllMovie() {
 $query = $this->db->query('SELECT * FROM movie ORDER BY id DESC');
 $movies = $query->fetchAll(PDO::FETCH_OBJ); // En PHP Objet, ne pas oublier le paramètre PDO::FETCH_OBJ, sinon ça ne marche pas
 return $movies;
 }

 public function showAllMovie() {
 foreach ($this->findAllMovie() as $movie) {
 echo '<div><a href="watching.php?id='.$movie->slug.'"><img src="assets/img/'.$movie->cover.'" alt="'.$movie->title.'"></a></div>';
 }
 }

 }


 $movie = new Movie();
 $movie->showAllMovie();
 
Ici il ne sert à rien.

Bonne soirée.