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.

17 réponses


PhiSyX
Réponse acceptée

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 ^^))

PhiSyX
Réponse acceptée

Essaye avec un A majuscule à \\app (méthode getTable).

Dans le fichier Autoloader.php dans ton dossier app/ , le namespace est bien "app" ?

Atome
Auteur

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';

        }
    }
}

Bonsoir,

Il y a un dossier app de trop apparemment.
On peut avoir ton fichier app ?

Atome
Auteur

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;

    }

}

Je sèche la

Atome
Auteur

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 :(

Tu as fini la vidéo refactoring ?

Atome
Auteur

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.

Atome
Auteur

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 ^^

Atome
Auteur

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.

Atome
Auteur

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 ?

Atome
Auteur

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.

Atome
Auteur

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