Bonjour tout le monde, je regarde en ce moment la partie refactoring du tuto sur la programmation orientée objet en php et je rencontre un problème avec l'autoloader. On voit dans la vidéo qu'il déplace l'autoloader dans le dossier core et qu'il ressemble à ceci :

<?php
namespace core;

class autoloader{

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

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

        require(ROOT . 'app/' . $class . '.php');
    }

}

Comment est-il possible avec cette classe d'inclure des classes du dossier core alors que l'autoload se déclenche automatiquement dans le dossier app ? J'ai essayé de modifier les deux autoloaders mais rien à faire alors si quelqu'un à une idée...
Merci d'avance!

2 réponses


kewai
Réponse acceptée

Car tu dois mettre juste

require $class . '.php';

Tu charges les 2 autoloader dans ton fichier app.php, et les chemins sont définis par ton namespace. Si tu utilises pas de namespaces, effectivement il va pas savoir ou chercher.
Si je dis pas de bêtise, il va check si le fichier se trouve dans le même namespace que l'autoloader, si c'est false il va tester avec l'autoloader suivant, quand bien même il test toujours les 2 autoloaders. Si c'est true il fait sont require.

Je pense que c'est pas plus mal c'est deux fichiers, quitte à repeter les meme chose au moins tu peux pas autoloader n'importe quoi.

hugopb82
Auteur
Réponse acceptée

ça marche nickel , merci!!! Je n'avais en effet pas compris le fonctionnement de la condition qui vérifie le namespace, je pensais qu'elle servait juste à enlever le namespace dans $class.
Voici ce qu'il faut faire :
Autoloader du dossier app :

namespace app;

class autoloader{

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

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

}

Autoloader du dossier core :

namespace core;

class autoloader{

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

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

}