Tuto MVC : Fatal error

Par Chris33, il y a 7 ans


Bonjour,

Je rencontre à ce moment un problème sur le tuto MVC : https://www.grafikart.fr/formations/programmation-objet-php/tp-database

Je pense que je fais une erreur sur les namespaces, j'ai beau chercher je n'arrive pas à faire fonctionner le blog.

Celà me retoune : Fatal error: Uncaught Error: Class 'App\Database' not found in C:\xampp\htdocs\Blog\pages\home.php:3 Stack trace: #0 {main} thrown in C:\xampp\htdocs\Blog\pages\home.php on line 3

Voici mon autoloader.php :

<?php namespace App; /** * Class Autoloader */ class Autoloader{ /** * Enregistre notre autoloader */ static function register(){ spl_autoload_register(array(__CLASS__, 'autoload')); } /** * Inclue le fichier correspondant à notre classe * @param $class string Le nom de la classe à charger */ static function autoload($class){ if (strpos($class, __NAMESPACE__ . '\\') === 0){ $class = str_replace(__NAMESPACE__ . '\\', '', $class); $class = str_replace('\\', '/', $class); require __DIR__ . '/' . $class . '.php'; } } } ?>

Voici mon fichier Database.php :

<?php namespace App; use \PDO; class Database{ private $db_name; private $db_user; private $db_pass; private $db_host; function __construct($db_name, $db_user = 'root', $db_pass = '', $db_host = 'localhost'){ $this->db_name = $db_name; $this->db_user = $db_user; $this->db_pass = $db_pass; $this->db_host = $db_host; } private function getPDO(){ $pdo = new PDO('mysql:dbname=blog', 'host=localhost', 'root', ''); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXECEPTION); $this->pdo = $pdo; return $pdo; } public function query($statement){ $req = $this->getPDO()->query($statement); $datas = $req->fetchAll(PDO::FETCH_OBJ); return $datas; } } ?>

Mon fichier home.php :

<?php $db = new App\Database('blog'); $datas = $db->query('SELECT * FROM articles'); var_dump($datas); ?>

J'ai l'impréssion de rencontrer une incompatibilité avec les nouvelles normes de PHP 7,
Je pense que je me trompe complétement aussi sur les namespaces \app ou \App
A force de toucher je ne sais plus quoi mettre notamment pour PDO ou \PDO
Quand je regarde le tutoriel, j'ai rencontré des erreurs de ce genre :

$this->$db_name = $db_name; // qui est plutôt $this->db_name = $db_name;

Ce qui est bizarre, c'est que le code de M. Grafikart est validé par chrome et ne retoune aucune erreur.
PHP 7 serait moins tolérant ?
J'attends votre aide en attendant je continue de chercher de mon côté.

Je vous remercie d'avance.

3 réponses

Lartak, il y a 7 ans

Bonjour.
Si tu n'inclues pas le fichier de la classe Autoloader et que tu ne l'initialise pas via Autoloader::register();, c'est tout à fait normal.

Chris33, il y a 7 ans

Bonjour,

Merci pour vos réponses.

1) Les namespaces :

La structure de mon MVC est la suivante :

Blog >
app >

Autoloader.php
Database.php
pages >
home.php
single.php
public >
css
js
index.php

Pour accéder à mon autolader depuis mon fichier Database.php :

<?php namespace Autoloader; use PDO; . . ?>

Puis de mon fichier home.php :

<?php namespace app\Autoloader; ?>

Je dois systématiquement mettre le namespace dans chaque page ?

2 ) L'Autoload :

Je dois faire un require :

require 'app\Autoloader.php';

Je pensais que le namespace s'éffectuer à la place du require :

<?php namespace app\Autoloader; ?>

Concernant l'initialisation :

require 'autoloader.php'; Autoloader::register();

Je dois l'initialiser dans mon fichier home.php ?

<?php namespace app\Autoloader; ?> <?php require 'app/Autoloader.php'; Autloader::register(); ?>

Ceci n'a aucun sens.. je suis perdu dans la compréhenssion et l'utilisation,
je n'arrive même pas à récupérer le fichier...

Quand je consulte la page : http://localhost/Blog/pages/home.php
Cela me retourne :

Fatal error: Uncaught Error: Undefined constant 'app' in C:\xampp\htdocs\Blog\app\Autoloader.php:2 Stack trace: #0 C:\xampp\htdocs\Blog\pages\home.php(2): require() #1 {main} thrown in C:\xampp\htdocs\Blog\app\Autoloader.php on line 2

Chris33, il y a 7 ans

J'ai finalement résolu le problème des namespace, mais je n'ai pas compris le fonctionnement.
J'ai rénommé tout mes namespaces en

namespace App;

cela fonctionne,
mais cela me laisse perplexe car mon dossier s'appel app et non App
et App n'est pas une classe pour moi mais un dossier.