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


Chris33
Auteur
Réponse acceptée

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.

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
Auteur

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