Bonjour,

Voila je rencontre un petit problème avec mon code, je ne comprends pas pourquoi mais il y a un problème avec mon autoload il essaye de charger ceci: "/app/Core/Table/Table.php", alors que je n'ai pas du tout cette aboresence là...

========================

Mes fichiers

(Core/Autoloader.php)

<?php
namespace Core;

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);
            $class_name = str_replace('\\', '/', $class_name);
            require __DIR__.'/'.$class_name.'.php';
        }
    }
}
?>

(App/Autoloader.php)

<?php
namespace App;
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);
            $class_name = str_replace('\\', '/', $class_name);
            require __DIR__.'/'.$class_name.'.php';
        }
    }
}
?>

(App/App.php)

<?php

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

class App
{
    private static $_instance;
    private $db_instance;

    public $title = 'Mon super site';

    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;
    }
}
?>

Mon erreur


( ! ) Warning: require(/var/www/whitesmoke/public_html/poo_video/Blog/app/Core/Table/Table.php): failed to open stream: No such file or directory in /var/www/whitesmoke/public_html/poo_video/Blog/app/Autoloader.php on line 15
Call Stack
#   Time    Memory  Function    Location
1   0.0003  237872  {main}( )   .../index.php:0
2   0.0008  265016  App->getTable( )    .../index.php:7
3   0.0008  265576  spl_autoload_call ( )   .../index.php:33
4   0.0008  265656  App\Autoloader::autoload( ) .../index.php:33
5   0.0009  267880  require( '/var/www/whitesmoke/public_html/poo_video/Blog/app/Table/ArticlesTable.php' ) .../Autoloader.php:15
6   0.0009  268136  spl_autoload_call ( )   .../Autoloader.php:7
7   0.0009  268176  App\Autoloader::autoload( ) .../Autoloader.php:7

( ! ) Fatal error: require(): Failed opening required '/var/www/whitesmoke/public_html/poo_video/Blog/app/Core/Table/Table.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/whitesmoke/public_html/poo_video/Blog/app/Autoloader.php on line 15
Call Stack
#   Time    Memory  Function    Location
1   0.0003  237872  {main}( )   .../index.php:0
2   0.0008  265016  App->getTable( )    .../index.php:7
3   0.0008  265576  spl_autoload_call ( )   .../index.php:33
4   0.0008  265656  App\Autoloader::autoload( ) .../index.php:33
5   0.0009  267880  require( '/var/www/whitesmoke/public_html/poo_video/Blog/app/Table/ArticlesTable.php' ) .../Autoloader.php:15
6   0.0009  268136  spl_autoload_call ( )   .../Autoloader.php:7
7   0.0009  268176  App\Autoloader::autoload( ) .../Autoloader.php:7

cela fait quelques heures que je bloque dessus :( si vous saviez m'aider ça serait vraiment magnifique ! Merci d'avance :)

4 réponses


Shady Ladow
Réponse acceptée

Hey ! J'ai eu exactement le même problème et en cherchant sur le forum et en combinant un peu toutes les solutions, j'ai réussi à le résoudre, voici mon code :3

Autoloader de 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 $class . '.php';
        }
    }

}

Autoloader de 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 $class . '.php';
        }
    }

}

Voilà, dis moi si ça fonctionne pour toi, je suis pas très douée en PHP donc je sais pas comment t'expliquer ce qui n'allait pas :/

serval154
Réponse acceptée

Bonjour,
selon le mesage d'erreur que tu reçois,

(" ! ) Warning: require(/var/www/whitesmoke/public_html/poo_video/Blog/app/Core/Table/Table.php): failed to open stream: No such file or directory in /var/www/whitesmoke/public_html/poo_video/Blog/app/Autoloader.php on line 15 "

Je pense que ton problème vient de ta méthode getTable dans ta class App. En effet tu dois avoir un dossier Tables au sein de ton dossier app qui contient lui aussi un dossier Table et tu n'y fait psa référence dans la méthode

Ta méthode:
public function getTable($name)
{
$class_name = '\App\Table\'.ucfirst($name).'Table';
return new $class_name($this->getDb());
}
Correction
public function getTable($name){
$class_name = '\App\Tables\Table\' . ucfirst($name) . 'Table';
return new $class_name($this->getDb());
}

De plus évite les == et remplace les par ===. C'est une vérification stricte plus poussée
Ton code
if(strpos($class_name, __NAMESPACE__.'\\') == 0)
Correction
if(strpos($class_name, __NAMESPACE__.'\\') === 0)

N'hésites pas si tu as besoin
cordialement

Bonjour.
Il y a une chose que je ne comprend pas, pourquoi faire deux autoloader dans la même application ?
Un seul devrait suffire.

Merci à Shady Ladow et Alain9034 pour vos réponses, ceci m'a permis de régler mon problème et d'en apprendre encore un peu plus :)