2017-06-29 1 views
0

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?

+1

Pourquoi n'utilisez-vous pas composer? – DaAmidza

+1

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

+0

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

Répondre

1

Comme je le disais dans les commentaires vérifier ce chemin

require(C:\wamp64\www\blog\appAutoloader.php/Table/PostsTable.php) 

ne semble pas le droit de me

require(C:\wamp64\www\blog\ [appAutoloader.php] /Table/PostsTable.php) 

Qu'est-ce que ça fait là peu ....

également l'espace de noms App n'est pas app pour le dossier son App parce que cela peut fonctionner sur Windows, mais vous trouverez que cela ne fonctionne pas sur Linux. Parce que les chemins Linux sont sensibles à la casse, et les fenêtres ne le sont pas.

De plus cela fait peu à aucun sens

require __DIR__ . 'Autoloader.php/' . $class . '.php'; // __DIR__ = the parent folder. Here "app" 

Exigent 2 fichiers? Les chemins ne fonctionnent pas de cette façon, pas que j'en ai au moins conscience.

En plus de cela votre implémentation ignore le _ Typiquement les soulignements font partie du nom de la classe mais sont remplacés par le répertoire, cela permet un espace de noms plus court. Ainsi, par exemple au lieu d'avoir un espace de noms comme celui-ci

 Namespace \APP\Table; 
    class PostsTable .. 

Vous pourriez avoir une catégorie au même endroit Comme tant

 Namespace \APP; 
    class Table_PostsTable .. 

Avec un espace de nom plus court, mais toujours situé dans le fichier App/Table/PostsTable.php. Cependant, c'est juste comme ça que je lis les spécifications pour les autochargeurs PSR.

PRO TIP

Prenez ce chemin C:\wamp64\www\blog\appAutoloader.php/Table/PostsTable.php ouvrir le navigateur de fichiers sur votre bureau et voir si elle tire vers le haut le fichier par le coller dans la barre de navigation. Il ne veut pas, mais vous pouvez être sûr que votre chemin est erroné en éliminant le code.

+0

Merci j'ai suivi ce que vous avez dit, et réussi à résoudre mon problème :) Merci d'autres aussi pour votre soutien! – Finalmix6

+0

Voir Je connais ces choses parce que j'ai réinventé la roue pour m'amuser et en profiter plusieurs fois. Rien de mal à apprendre comment ces choses fonctionnent ... En fait apprendre PHP, et tous les cadres tombent à vos pieds. – ArtisticPhoenix