Bonjour à vous,

je me permets de vous contacter car je n'arrive pas à trouver la solution à mon problème.

En fait, j'utilise entre autre les namespaces ainsi qu'un autoloader pour charger les différentes classes dont j'ai besoin.

Les classes "Autoloader" et "Appl" se trouve dans le répertoire "app\classe".

Quand je charge ma page index.php qui se trouve dans le répertoire "publics", je reçois l'erreur suivante :

<<

PHP Fatal error: Uncaught Error: Class 'App\Classe\Appl' not found in C:\Users\Affin-IT\PhpstormProjects\Blog2\publics\index.php:14
Stack trace:

0 {main}

thrown in C:\Users\Affin-IT\PhpstormProjects\Blog2\publics\index.php on line 14

Process finished with exit code 255

Il bloque sur l'instruction : Appl::getInstance();

Il n'arrive pas à trouver ma classe "Appl".

Voici le code des différentes pages :

index.php :

<?php
define('ROOT', dirname(DIR));

use \App\Classe\Autoloader;

use \App\Classe\Appl;

require ROOT . '\app\classe\Autoloader.php';

Autoloader::register();

require ROOT . '\app\classe\Appl.php';

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>
Autoloader.php :
Code : Tout sélectionner

<?php
namespace App\Classe;

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

    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 '..\\app\\classe\\' . $class_name . '.php';
        }
    }
}

?>

Appl.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)
    {
        $classe_name = '\\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;
    }
}

?>

Avez-vous une idée du problème ?

Merci d'avance

Bonne soirée
Thierry

5 réponses


Bonsoir.
Tu ne sembles vraisemblablement pas avoir compris comment fonctionne les autoloader et les namespaces, tu devrais donc suivre le tutoriel vidéo qui parle justement de l'autoloader.
Car si tu cherches à charger des classes avec l'autoloader avant même d'inclure celui-ci, ce n'est pas du tout étonnant que tu aies des erreurs qui te disent que telle ou telle classe n'a pas été trouvée.
Le début de ton fichier index.php devrait plutôt être comme ceci :

<?php
define('ROOT', dirname(DIR));
require ROOT . '\app\classe\Autoloader.php';
Autoloader::register();
// Ensuite tu peux faire tes use pour charger tes classes et les utiliser
thirt05
Auteur

Bonjour Lartak,

tout d'abord, je tenais à vous remercier pour votre réponse à mon message.

En fait, j'avais bien fait ce que vous dites dans votre réponse.

Voici le code pour la page index.php :

<?php
    define('ROOT', dirname(__DIR__));

    use \App\Classe\Autoloader;

    use \App\Classe\Appl;

    require ROOT . '\app\classe\Autoloader.php';

    Autoloader::register();

    require ROOT . '\app\classe\Appl.php';

    Appl::getInstance();

    if (isset($_GET['p']))
    {
        $p = $_GET['p'];
    }
    else
    {
        $p = 'home';
    }
?>

Malheureusement, comme vous vous en doutez, je reçois toujours cette erreur.

Merci d'avance

Bonne journée
Thierry

En fait, j'avais bien fait ce que vous dites dans votre réponse.

Non, puisque tu utilises les use avant même d'inclure ton autoloader et puis lorsque tu utilises les use, il est inutile d'inclure les fichiers des classes via require ou include, sinon autant ne pas utiliser d'autoloader.

thirt05
Auteur

Bonsoir Lartak,

je tenais encore à vous remercier pour votre réponse à mon message.

En me basant sur vos conseils, voici donc le code de ma page index.php :

<?php
    define('ROOT', dirname(__DIR__));

    require ROOT . '\app\classe\Autoloader.php';

    use \App\Classe\Autoloader;

    Autoloader::register();

    use \App\Classe\Appl;

    $app = Appl::getInstance();
?>

Êtes-vous d'accord avec cette solution ?

Merci d'avance

Bonne soirée
Thierry

Êtes-vous d'accord avec cette solution ?

Oui tout à fait, à part qu'il est inutile ici de faire un use de \App\Classe\Autoloader puisque la classe est déja inclue via le require juste avant.