par
thirt05 » 17 déc. 2018, 21:14
Bonsoir,
en fait, j'utilise des namespaces et un autoloader pour charger toutes les classes dont j'ai besoin.
Quand j'essaie de créer une nouvelle instance de la classe 'PostTable', je reçois l'erreur suivante :
<<
PHP Fatal error: Uncaught Error: Class 'C:\Users\Affin-IT\PhpstormProjects\Blog2\app\classe\table\PostTable' not found in C:\Users\Affin-IT\PhpstormProjects\Blog2\app\classe\Appl.php:52
>>
Voici le code de la classe PostTable : cette classe se trouve dans le répertoire app\classe\table
Code : Tout sélectionner
<?php
namespace App\Classe\Table;
use Core\Table\Table;
class PostTable extends Table
{
protected $table = 'articles';
/**
* Récupère les derniers posts
* @return array
*/
public function last()
{
return $this->query("
SELECT articles.id, articles.titre, articles.contenu, articles.date, categories.titre as categorie
FROM articles
LEFT JOIN categories ON category_id = categories.id
ORDER BY articles.date DESC"
);
}
/**
* Récupère un article en liant les catégories associées
* @param $id int
* @return \App\Classe\Entity\PostEntity
*/
public function find($id)
{
return $this->query("
SELECT articles.id, articles.titre, articles.contenu, articles.date, categories.titre as categorie
FROM articles
LEFT JOIN categories ON category_id = categories.id
WHERE articles.id = ?", [$id], true);
}
/**
* Récupère les derniers articles de la catégorie demandée
* @param $category_id int
* @return array
*/
public function lastByCategory($category_id)
{
return $this->query("
SELECT articles.id, articles.titre, articles.contenu, articles.date, categories.titre as categorie
FROM articles
LEFT JOIN categories ON category_id = categories.id
WHERE articles.category_id = ?
ORDER BY articles.date DESC", [$category_id]
);
}
}
?>
Voici le code de la classe Appl : cette classe se trouve dans le répertoire app\classe
Code : Tout sélectionner
<?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)
{
$class_name = ROOT . '\\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;
}
public function forbidden()
{
header('HTTP/1.0 403 Forbidden');
die('Accès interdit !!!');
}
public function notFound()
{
header('HTTP/1.0 404 Not Found');
die('Page introuvable !!!');
}
}
?>
Voici le code de l'autoloader : cette classe se trouve dans le répertoire app\classe
Code : Tout sélectionner
<?php
namespace App\Classe;
class Autoloader {
static function register()
{
spl_autoload_register(array(__CLASS__, 'autoload'));
}
/**
* @param $class_name
*/
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 ROOT . '\\app\\classe\\' . $class_name . '.php';
}
}
}
?>
Et enfin, voici le code de la page index.php qui se trouve dans le répertoire publics :
Code : Tout sélectionner
<?php
define('ROOT', dirname(__DIR__));
require ROOT . '\app\classe\Autoloader.php';
use \App\Classe\Autoloader;
Autoloader::register();
use \App\Classe\Appl;
$app = 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>
Avez-vous une idée du problème ?
Merci d'avance
Bonne soirée
Thierry
Bonsoir,
en fait, j'utilise des namespaces et un autoloader pour charger toutes les classes dont j'ai besoin.
Quand j'essaie de créer une nouvelle instance de la classe 'PostTable', je reçois l'erreur suivante :
<<
PHP Fatal error: Uncaught Error: Class 'C:\Users\Affin-IT\PhpstormProjects\Blog2\app\classe\table\PostTable' not found in C:\Users\Affin-IT\PhpstormProjects\Blog2\app\classe\Appl.php:52
>>
Voici le code de la classe PostTable : cette classe se trouve dans le répertoire app\classe\table
[code]
<?php
namespace App\Classe\Table;
use Core\Table\Table;
class PostTable extends Table
{
protected $table = 'articles';
/**
* Récupère les derniers posts
* @return array
*/
public function last()
{
return $this->query("
SELECT articles.id, articles.titre, articles.contenu, articles.date, categories.titre as categorie
FROM articles
LEFT JOIN categories ON category_id = categories.id
ORDER BY articles.date DESC"
);
}
/**
* Récupère un article en liant les catégories associées
* @param $id int
* @return \App\Classe\Entity\PostEntity
*/
public function find($id)
{
return $this->query("
SELECT articles.id, articles.titre, articles.contenu, articles.date, categories.titre as categorie
FROM articles
LEFT JOIN categories ON category_id = categories.id
WHERE articles.id = ?", [$id], true);
}
/**
* Récupère les derniers articles de la catégorie demandée
* @param $category_id int
* @return array
*/
public function lastByCategory($category_id)
{
return $this->query("
SELECT articles.id, articles.titre, articles.contenu, articles.date, categories.titre as categorie
FROM articles
LEFT JOIN categories ON category_id = categories.id
WHERE articles.category_id = ?
ORDER BY articles.date DESC", [$category_id]
);
}
}
?>
[/code]
Voici le code de la classe Appl : cette classe se trouve dans le répertoire app\classe
[code]
<?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)
{
$class_name = ROOT . '\\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;
}
public function forbidden()
{
header('HTTP/1.0 403 Forbidden');
die('Accès interdit !!!');
}
public function notFound()
{
header('HTTP/1.0 404 Not Found');
die('Page introuvable !!!');
}
}
?>
[/code]
Voici le code de l'autoloader : cette classe se trouve dans le répertoire app\classe
[code]
<?php
namespace App\Classe;
class Autoloader {
static function register()
{
spl_autoload_register(array(__CLASS__, 'autoload'));
}
/**
* @param $class_name
*/
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 ROOT . '\\app\\classe\\' . $class_name . '.php';
}
}
}
?>
[/code]
Et enfin, voici le code de la page index.php qui se trouve dans le répertoire publics :
[code]
<?php
define('ROOT', dirname(__DIR__));
require ROOT . '\app\classe\Autoloader.php';
use \App\Classe\Autoloader;
Autoloader::register();
use \App\Classe\Appl;
$app = 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>
[/code]
Avez-vous une idée du problème ?
Merci d'avance
Bonne soirée
Thierry