Bonjour,
je suis actuellement sur la video : "La POO en PHP (18/30) : TP : Refactoring"
Mais des le debut je coince ..
J'obtiens les erreurs suivante :

"( ! ) Fatal error: Uncaught Error: Class 'core\Config' not found in C:\wamp64\www\exoPHP\Forma\app\App.php on line 36around( ! ) Error: Class 'core\Config' not found in C:\wamp64\www\exoPHP\Forma\app\App.php on line 36"

Pourtant, tout semble ok. Le dossier racine est "Forma".
Emplacement de App.php : Forma\app\App.php
Emplacement de Config.php : Forma\core\Config.php
App.php :

<?php
use core\Config;
use core\Databse\MysqlDatabase;

class App{

    public $title = 'Lardio Website';
    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 'Autoloader.php';
        app\Autoloader::register();
        require '../core/Autoloader.php';
        core\Autoloader::register();
    }

    public function getTable($name){
        $class_name = '\\app\\Tab\\' . ucfirst($name) . 'Table';
        return new $class_name($this->getDb()); // on recupere la connexion a la bdd en parametre lors de l'instanciation d'une nouvelle classe.
    }

    public function getDb(){
        $test = ROOT . '\config\config.php';
        echo $test;
        $config = Config::getInstance(ROOT . '\config\config.php'); //singloton
        if(is_null($this->db_instance)){ // on verrifie que linstance est nulle pour eviter de la creer.
            $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; // on retourne l'instance
    }
}

?>

Config.php :

<?php
namespace core;
class Config{

    private $settings = [];
    private static $_instance;

    public static function getInstance($file)
    {
        if(is_null(self::$_instance)){
            self::$_instance = new Config();
        }
        return self::$_instance;
    }

    public function __construct($file){
        $this->settings = require($file); 
    }

    public function get($key){
        if(!isset($this->settings[$key])){
            return null;
        }
        return $this->settings[$key];   
    }
}
?>

Je vois pas ou est mon erreur .. Peut etre une erreur d'innatention que je detect pas .. Aussi par test, j'ai duplique le fichier Congif.php dans le meme dossier que App.php, et change le use avec -> use app\Config; .. et la ca fonctionne ..

Franchement je coince, et une aide sera la mega hyper top bienvenue !

Merci d'avance :)
Cdlt

4 réponses


Lartak
Réponse acceptée

Je viens de remarquer qu'il y a un problème dans ta classe Config, son constructeur nécessite un paramêtre, sauf que lorsque tu veux instancier la classe (getInstance), tu ne définies pas le parmêtre dans le constructeur de la classe.
Il te faut donc déjà remplacer :

public static function getInstance($file)
{
    if(is_null(self::$_instance)){
        self::$_instance = new Config();
    }
    return self::$_instance;
}

Par :

public static function getInstance($file)
{
    if(is_null(self::$_instance)){
        self::$_instance = new Config($file); // Modification ici
    }
    return self::$_instance;
}

Ensuite, montres nous le code de ta classe Autoloader du namespace core, car le problème doit se trouver dans cette classe.
Sinon, si tu ne veux pas trop te prendre la tête, tu peux très bien utiliser l'autoloader de Composer, voir ici : Tutoriel Vidéo PHP » Composer, je te dirais même que je te le conseille, car même si ce n'est pas forcément le cas actuellement, tu seras bientôt contraint à l'utiliser.

Bonjour.
Ton problème est dû au fait que tu as à priori nommé Core.php le fichier de ta classe Config, alors que tu dois nommer ton fichier comme le nom de ta classe, soit Config.php, c'est à dire le nom de ta classe plus l'extension php.

Lardio
Auteur

Salut !
Merci pour le retour rapide !
Et ah .. erreur de ma part, excuses moi .. j'ai du m'embrouiller au moment d'ecrire ce post, mais mon fichier qui contient la classe Config se nomme bien Config.php. Je n'ai donc pas de fichier "Core.php".
J'ai editer mon post d'origine.
Merci en tout cas d'avoir remonter l'incoherence !

Et sinon .. je suis toujours dans l'impasse avec mon erreur :(

Cdlt,

Lardio
Auteur

Merci pour le retour, et oui tu avais raison, dans mon Autoloader du namespace core, j'avais "namespace Core" ..
Ensuite j'ai eu pas mal d'erreurs mais pour le reste j'ai reussis a m'en sortir.
Ah je vais pouvoir dormir plus tranquillement sachant que ce probleme qui m'a pris la tete est derriere moi ! Faut vraiment que je sois plus attentif a ce genre de trucs ..

Pour Composer je vais regarder ca demain du coup.
Un grand merci a toi !!!!

Cdlt