Bonjour,

Voila je rencontre un petit problème avec mon code, pour le tutoriel "TP : Refactoring" de la formation POO en PHP, aux alentours de la 20ème minute. Mon code semble bon, et je suis rassuré en voyant que je ne suis pas le seul à rencontrer ce problème. (en observant les commentaires je peux voir que d'autres personnes sont dans un cas similaire).
J'ai regardé des sujets sur le forum en rapport avec ce tutoriel mais les corrections chez moi ne semblent pas marcher ...

L'erreur affichée est la suivante:

Fatal error: Class 'Core\Table\Table' not found in C:\wamp\www\Blog\app\Table\UserTable.php on line 7
<?php

use Core\Config;
use Core\Database\MysqlDatabase;

class App{

    public $title = 'Blog 2.0';
    private static $_instance;
    private $db_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('db_host'));
        }

        return $this->db_instance;
    }
}
<?php

/* Autoloader pour App est le même que celui de Core excepté le namespace */

namespace App;

class Autoloader{

    /* Enregistre notre autoloader */

    static function register(){
        spl_autoload_register(array(__CLASS__, 'autoload'));
    }

    /* Inclue le fichier correspondant à notre classe */

    static function autoload($class){
        if(strpos($class, __NAMESPACE__ . '\\') === 0){
            $class = str_replace(__NAMESPACE__. '\\', '', $class);
            $class = str_replace('\\', '/', $class);
            require __DIR__.'/'.$class.'.php';

        }
    }
}
<?php
namespace App\Table;
class UserTable extends Core\Table\Table{
}
<?php

namespace Core\Table\Table;

use Core\Database\Database;

class Table{

    protected $table;
    protected $db;

    public function __construct(Database $db){
        $this->db = $db;
        if(is_null($this->table)){
            $parts = explode('\\', get_class($this));
            $class_name = end($parts);
            $this->table = strtolower(str_replace('Table', '', $class_name));

        }

    }

    public function all(){
        return $this->db->query('SELECT * FROM articles');
    }

    public function query($statement, $attributes = null, $one = false){
        if($attributes){
            return $this->db->prepare(
                $statement, 
                $attributes, 
                str_replace('Table', 'Entity', get_class($this)), 
                $one
            );
        }
        else{
            return $this->db->query(
                $statement, 
                str_replace('Table', 'Entity', get_class($this)), 
                $one
            );
        }
    }
}

Je cherche à récupérer la classe Table se situant à '/core/Table/Table.php

Merci par avance :)

10 réponses


serval154
Réponse acceptée

Bonjour

Le namespace de ta class Table est :
namespace Core\Table et non pas Core\Table\Table comme tu l'a écris. Je penses que ton problème viens de là
Dans cette même class Table tu as mis la variable $db en protected au lieu de de private.

sinon vérifies les petits annotations suivantes.

2) Ta function all devrait s'écrire ainsi:

public function all(){
return $this->query(' SELECT * FROM ' . $this->table );
}

3) Voici le code de la classe UserTable tel que tu devrais l'écrire car on place toujours les use en début de fichier

<?php

namespace App\Table;

use Core\Table\Table;

class UserTable extends Table{

}

4) Dans ton fichier index qui se trouve dans le dossier public normalement a-tu bien vérifié la définition de la constante ROOT comme ceci?

define('ROOT', dirname(DIR));
require ROOT . '/app/App.php';
App::load();

5) Dans ta class App inverse tes uses comme ceci:

use Core\Database\MysqlDatabase;
use Core\Config;

Bien cordialement

Alain

Ben ton namespace de c'est Core\Table\Table dans userTable et App\Table\Table dans la classe Table cela ne viendrais t-il pas de la?

Kboirel
Auteur

Oups j'avais pas mis le bon code (j'avais fais quelques tests pour essayer de résoudre le problème) sans succès. Du coup le problème ne vient pas de là, quand je met le bon namespace, cela ne marche pas ...

cela ne viendrais pas de ton autoloader? tu as fait quoi comme tests?

Kboirel
Auteur

Si si je pense ....
J'ai étudié ces topics :

http://www.grafikart.fr/forum/topics/15901
http://www.grafikart.fr/forum/topics/15561

J'ai essayé de reproduire la même chose mais ca ne marche pas ...

public static function load(){
        session_start();
        require ROOT. '/app/Autoloader.php';
        App\Autoloader::register();
        require ROOT. '/core/Autoloader.php';
        \Core\Autoloader::register();
    }

Dans ton code, tu as mis un antislash devant :

Core\Autoloader::register();
Kboirel
Auteur

Encore une erreur de ma part sur le post du forum, c'est une erreur que j'ai betement laissé après avoir fais plein de tests, mais ce n'est malheuresment pas la cause du problème ....

(J'ai edité mon premier post pour que ce soit plus clair)

Kboirel
Auteur

https://drive.google.com/file/d/0B9N3Lmt1kW5FSmFpOWZOWS05eTQ/view

Voici le message d'erreur, si ça peut aider à résoudre le problème ...

Kboirel
Auteur

J'ai honte tellement c'était evident .... je ne sais pas comment j'ai pu ne pas voir cette erreur ..... Ca marche maintenant c'est super !!!
Il me restait cependant un erreur (qui n'apparait pas sur la vidéo (du moins pas avant les 20 premières minutes)) concernant l'affichage de catégorie.

Après avoir fait un var dump de $post, ce n'est pas

<p><em><?= $post->categorie;?></em></p>

mais "catergories" avec un S :)

Un énorme merci en tout cas pour avoir débloqué mon cas !! :)

Ravi que cela fonctionne.

Une petite remarque toutefois. Si tu débutes en PHP ou en Web en général. Les tutos de Jonathan de GRAFIKART sont assez hards mais ils sont pour moi ce qui se fait de mieux. Dans ce tutos sur la POO on y apprend énormément de chose, mais comme il le dit dans la partie finale essayes de ne pas utiliser le français mais l'anglais pour nommer tes fichiers et pas au pluriel comme par exemple articles ou categories. Même si il l'a fait pour plus de compréhension lui même reconnait qu'il vaut mieux dès le départ remplacer les fichiers en français par l'anglais cela donne "post" pour "articles" et "category" pour "categories". Si tu as le temps pour mieux analyser et comprendre le code refais ce tutos dans ce sens. Essayes de noter sur un feuille de papier son modèle et tentes de le refaire sans t'aider de la vidéo. Si tu plantes regardes là où tu as plantés.
tu verras qu'avec le temps tu auras de bonnes bases tant en PHP qu'en POO.
Je te conseille le tutos qu'il a fait en deux étapes sur la gestion d'un espace membre en version spaghetti et ensuite en refactoring. Ceux-là pour moi sont les deux meilleurs tutos qu'il ai réaliser après le chapitre sur la POO. Il y a aussi celui sur la réalisation d'un router qui est trés bien. Je ne fais du web que depuis jullet 2015, j'y connaissais rien à ces langages. Aujourd'ui mes sites tournent déjà bien sécurisés sur mon serveur dédiés et mes applications suffisent à mes clients.
Persévères et bon web.

Bye Alain