Page 1 sur 1

PHP Fatal error: Uncaught Error: Class 'PostTable' not found ...

Posté : 17 déc. 2018, 21:14
par thirt05
Bonsoir,

en fait, j'utilise des namespaces et un autoloader pour charger toutes les classes dont j'ai besoin.

Quand j'essaie de créer une nouvelle instance de la classe 'PostTable', je reçois l'erreur suivante :

<<
PHP Fatal error: Uncaught Error: Class 'C:\Users\Affin-IT\PhpstormProjects\Blog2\app\classe\table\PostTable' not found in C:\Users\Affin-IT\PhpstormProjects\Blog2\app\classe\Appl.php:52
>>

Voici le code de la classe PostTable : cette classe se trouve dans le répertoire app\classe\table

Code : Tout sélectionner

<?php namespace App\Classe\Table; use Core\Table\Table; class PostTable extends Table { protected $table = 'articles'; /** * Récupère les derniers posts * @return array */ public function last() { return $this->query(" SELECT articles.id, articles.titre, articles.contenu, articles.date, categories.titre as categorie FROM articles LEFT JOIN categories ON category_id = categories.id ORDER BY articles.date DESC" ); } /** * Récupère un article en liant les catégories associées * @param $id int * @return \App\Classe\Entity\PostEntity */ public function find($id) { return $this->query(" SELECT articles.id, articles.titre, articles.contenu, articles.date, categories.titre as categorie FROM articles LEFT JOIN categories ON category_id = categories.id WHERE articles.id = ?", [$id], true); } /** * Récupère les derniers articles de la catégorie demandée * @param $category_id int * @return array */ public function lastByCategory($category_id) { return $this->query(" SELECT articles.id, articles.titre, articles.contenu, articles.date, categories.titre as categorie FROM articles LEFT JOIN categories ON category_id = categories.id WHERE articles.category_id = ? ORDER BY articles.date DESC", [$category_id] ); } } ?>
Voici le code de la classe Appl : cette classe se trouve dans le répertoire app\classe

Code : Tout sélectionner

<?php namespace App\Classe; use Core\Config; use Core\Database\MysqlDatabase; class Appl { public $title = "Mon Super Site"; private $db_instance; private static $_instance; public static function getInstance() { if (is_null(self::$_instance)) self::$_instance = new Appl(); return self::$_instance; } public static function load() { session_start(); require ROOT . '\app\Autoloader.php'; App\Autoloader::register(); require ROOT . '\core\Autoloader.php'; Core\Autoloader::register(); } public function getTable($name) { $class_name = ROOT . '\\app\\classe\\table\\' . ucfirst($name) . 'Table'; return new $class_name($this->getDb()); } public function getDb() { $config = Config::getInstance(ROOT . '\core\config\config.php'); if (is_null($this->db_instance)) { $this->db_instance = new Database\MysqlDatabase( $config->get('db_name'), $config->get('db_user'), $config->get('db_password'), $config->get('db_host') ); } return $this->db_instance; } public function forbidden() { header('HTTP/1.0 403 Forbidden'); die('Accès interdit !!!'); } public function notFound() { header('HTTP/1.0 404 Not Found'); die('Page introuvable !!!'); } } ?>
Voici le code de l'autoloader : cette classe se trouve dans le répertoire app\classe

Code : Tout sélectionner

<?php namespace App\Classe; class Autoloader { static function register() { spl_autoload_register(array(__CLASS__, 'autoload')); } /** * @param $class_name */ static function autoload($class_name) { if (strpos($class_name, __NAMESPACE__ . '\\') === 0) { $class_name = str_replace(__NAMESPACE__ . '\\', '', $class_name); // Remplacer les anti-slashes par des slashes si je travaille sous UNIX //$class_name = str_replace('\\', '/', $class_name); require ROOT . '\\app\\classe\\' . $class_name . '.php'; } } } ?>
Et enfin, voici le code de la page index.php qui se trouve dans le répertoire publics :

Code : Tout sélectionner

<?php define('ROOT', dirname(__DIR__)); require ROOT . '\app\classe\Autoloader.php'; use \App\Classe\Autoloader; Autoloader::register(); use \App\Classe\Appl; $app = Appl::getInstance(); if (isset($_GET['p'])) { $p = $_GET['p']; } else { $p = 'home'; } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> <meta name="format-detection" content="telephone=no"> <body> <?php ob_start(); if ($p === 'home') { echo require ROOT . '\pages\posts\home.php'; } elseif ($p === 'posts.category') { require ROOT . '\pages\posts\hcategory.php'; } elseif ($p === 'posts.show') { require ROOT . '\pages\posts\hshow.php'; } $content = ob_get_clean(); require ROOT . '\pages\templates\default.php'; ?> </body> </html>
Avez-vous une idée du problème ?

Merci d'avance

Bonne soirée
Thierry

Re: PHP Fatal error: Uncaught Error: Class 'PostTable' not found ...

Posté : 17 déc. 2018, 23:52
par Saian
A mon avis tu dois avoir un problème avec ta fonction d'autoload.
Si la classe n'est pas définie c'est que l'autoloader n'a pas du faire le require du fichier contenant la classe.
Peut être la condition if (strpos($class_name, __NAMESPACE__ . '\\') === 0) retourne false ?
J'essaierai de la débuguer pour commencer. Vérifie la valeur de $class_name et de __NAMESPACE__ . '\\' et vérifie le retour du strpos.