J'ai rencontré un petit problème avec mes classes: elles ne se chargent tout simplement pas via mon chargeur automatique.Problème d'autoloader d'objet orienté PHP
Je reçois cette erreur de message:
Warning: require(C:\wamp64\www\blog\appAutoloader.php/Table/PostsTable.php): failed to open stream: No such file or directory in C:\wamp64\www\blog\app\Autoloader.php on line 23
Fatal error: require(): Failed opening required 'C:\wamp64\www\blog\appAutoloader.php/Table/PostsTable.php' (include_path='.;C:\php\pear') in C:\wamp64\www\blog\app\Autoloader.php on line 23
usine classe:
use Core\config;
use Core\Database\MysqlDatabase;
class App {
public $title = "My super site";
private $db_instance;
private static $_instance;
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;
}
}
App Namespace classe chargeur automatique:
<?php
namespace App;
class Autoloader {
static function register()
{
spl_autoload_register(array(__CLASS__, 'autoload')); // __CLASS__ load the current class
}
static function autoload($class)
{
if (strpos($class, __NAMESPACE__ .'\\') === 0) {
$class = str_replace(__NAMESPACE__ . '\\', '', $class); // _NAMESPACE_ load the current name_space
$class = str_replace('\\', '/', $class);
require __DIR__ . 'Autoloader.php/' . $class . '.php'; // __DIR__ = the parent folder. Here "app"
}
}
}
classe Namespace base chargeur automatique:
<?php
namespace Core;
class Autoloader {
static function register()
{
spl_autoload_register(array(__CLASS__, 'autoload')); // __CLASS__ load the current class
}
static function autoload($class)
{
if (strpos($class, __NAMESPACE__ .'\\') === 0) {
$class = str_replace(__NAMESPACE__ . '\\', '', $class); // _NAMESPACE_ load the current name_space
$class = str_replace('\\', '/', $class);
require __DIR__ . 'Autoloader.php/' . $class . '.php'; // __DIR__ = the parent folder. Here "app"
}
}
}
vide PostTable
namespace App\Table;
use Core\Table\Table;
class PostsTable extends Table
{
}
page d'index:
define('ROOT', dirname(__DIR__));
require ROOT . '/app/App.php';
App::load();
$app = App::getInstance();
$posts = $app->getTable('Posts');
var_dump($posts->all());
Comment faire cela fonctionne s'il vous plaît?
Pourquoi n'utilisez-vous pas composer? – DaAmidza
Je suis d'accord avec @ Arslan.H - il n'y a aucune raison de ne pas utiliser le compositeur, car vous pouvez oublier complètement les problèmes de chargement automatique pour toujours. Si vous décidez de suivre votre propre voie, je vous souhaite la meilleure des chances. Rappelez-vous juste - il n'y a pas besoin de réinventer la roue. – Mjh
Je ne suis pas d'accord, si vous voulez savoir comment une roue fonctionne vraiment, puis en créer une vous-même, il n'y a rien de mal à réinventer quoi que ce soit. – ArtisticPhoenix