Bonjour,
Actuellement à l'étape de Refactoring sur le tutoriel POO en PHP, je suis confronté à un problème d'appel sur les autoloader.
Conscient que d'autres sujets existent, j'aimerais comprendre pourquoi j'obtiens une erreur.
Mon arborescence a bien été reporté comme sur tutoriel
/Blog/app
/Blog/core
J'ai bien un Autoloader dans app avec le namespace App et un Autoloader dans core avec le namespace Core
Dans le fichier index.php, j'ai le code suivant :
define('ROOT', dirname(__DIR__));
require ROOT . '/app/App.php';
App::load();
$app = App::getInstance();
$posts = $app->getTable('Articles');
var_dump($posts);
Pourtant le code part en erreur et j'obtiens le message suivant :
( ! ) Warning: require(C:\wamp\www\Blog\app/app/Table/ArticlesTable.php): failed to open stream: No such file or directory in C:\wamp\www\Blog\app\Autoloader.php on line 14
( ! ) Fatal error: require(): Failed opening required 'C:\wamp\www\Blog\app/app/Table/ArticlesTable.php' (include_path='.;C:\php\pear') in C:\wamp\www\Blog\app\Autoloader.php on line 14
Je n'arrive pas a comprendre mon erreur, une petite idée ?
Merci d'avance.
Yop. Il faut y mettre un triple égal à ta condition if(strpos($class, __NAMESPACE__ . '\\') == 0) {
dans ton fichier Autoloader.php. Effectivement car strpos peut retourner false
(et == 0
équivaut à == false
(car pas de comparaison sur les types en cas de double égal ^^))
Bonjour
Oui en effet, voici le code de mon Autoloader :
namespace App;
class Autoloader {
static function register () {
spl_autoload_register(array(__CLASS__, 'autoload'));
}
static function autoload ($class) {
if(strpos($class, __NAMESPACE__ . '\\') == 0) {
$class = str_replace(__NAMESPACE__ . '\\', '', $class);
$class = str_replace('\\', '/', $class);
require __DIR__ . '/' . $class . '.php';
}
}
}
Le voila :
<?php
use Core\Config;
use Core\Database\MysqlDatabase;
class App {
public $title = "Mon site";
private $db_instance;
private static $_instance;
public static function getInstance() {
if(is_null(self::$_instance)) {
self::$_instance = new App();
}
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 = '\\app\\Table\\' . ucfirst($name) . "Table";
return new $class_name($this->getDb());
}
public function getDb() {
$config = Config::getInstance(ROOT . '/config/config.php');
if(is_null($this->db_instance)) {
$this->db_instance = new MysqlDatabase($config->get('db_name'), $config->get('db_user'), $config->get('db_pass'), $config->get('host'));
}
return $this->db_instance;
}
}
Si besoin je peux mettre mon code a disposition sur une archive mais je séche aussi et ça m'embéte car j'ai un peu avancé dans la video et je ne peux continuer avec cette erreur :(
Non pas encore, je me suis fixé d'avoir le meme rendu a chaque fois qu'il en a un sur la vidéo, du coup je bloque a 7min40
Avance un peu car je suis en train de refaire cette formation et il me semble avec eu le même soucis.
J'ai avancé jusqu'a 24min et rien de plus, je tenterai de la finir et je reviendrais sur le sujet, merci d'avoir jeter un coup d'oeil ^^
Ah merci PhiSyX, en effet je n'avais que deux égals sur trois, il m'affiche une nouvelle erreur, je vais fouiller un peu et vous tiens au courant, merci encore.
Bon du coup je recommence à sécher sur une autre erreur :
public function getTable($name) {
$class_name = "\\app\\Table\\" . ucfirst($name) . 'Table';
return new $class_name($this->getDb());
}
Ma variable $class_name , est bien égale a \app\Table\ArticleTable, le fichier ArticleTable.php posséde bien la classe en extends sur la class du fichier Table.php situé dans core/Table, donc il ne devrait y avoir aucun problème sur l'appel
Quel est le nouveau message d'erreur? ^^
Le fichier ArticleTable.php a-t-il namespace App\Table
en début de fichier ?
J'ai procédé a un renommage de ma table article en posts ainsi que l'appel aux class et nom de fichier.
La nouvelle erreur est :
Fatal error: Class '\app\Table\PostTable' not found in C:\wamp\www\Blog\app\App.php on line 29
Mon fichier PostTable.php (ancien ArticleTable.php) a bien le namespace App\Table.
C'est ignoble de savoir que dans la vidéo, il y a bien une majuscule, je me suis pourtant arréter a toutes les classes mais enfin c'est réglé grâce à toi, merci
Ps : en renommant les quelques derniers trucs, j'ai de nouveau un affichage fonctionnel, je peux enfin continuer, merci encore pour ton aide