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:
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
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
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.
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.