Tuto MVC : Fatal error

Ce sujet est résolu
Default
,

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éponse

Default
,

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.

17162
, Il a répondu à ma question !

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.

Default
, Il a répondu à ma question !

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