2017-06-29 3 views
0

Ich habe ein kleines Problem mit meinen Klassen: sie werden einfach nicht durch meinen Autoloader geladen.Oriented Object PHP Autoloader Ausgabe

Ich bekomme diese Fehlermeldung:

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


Factory-Klasse:

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

Namespace App Autoloader Klasse:

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

} 
} 

Namespace Core-Autoloader-Klasse:

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

} 
} 

Leere PostTable

namespace App\Table; 

use Core\Table\Table; 

class PostsTable extends Table 
{ 

} 

Index Seite:

define('ROOT', dirname(__DIR__)); 
require ROOT . '/app/App.php'; 
App::load(); 
$app = App::getInstance(); 

$posts = $app->getTable('Posts'); 
var_dump($posts->all()); 

Wie bitte es funktioniert machen?

+1

Warum verwenden Sie nicht Komponist? – DaAmidza

+1

Ich stimme @ Arslan.H zu - es gibt keinen Grund, den Composer nicht zu verwenden, da Sie Probleme mit Autoloading für immer vergessen können. Wenn Sie sich entscheiden, Ihre eigene Route zu gehen, wünsche ich Ihnen viel Glück beim Aussortieren. Denken Sie daran - das Rad muss nicht neu erfunden werden. – Mjh

+0

Ich stimme nicht zu, wenn Sie wissen wollen, wie ein Rad wirklich funktioniert, dann erstellen Sie eines selbst, es ist nichts falsch daran, etwas neu zu erfinden. – ArtisticPhoenix

Antwort

1

AS sagte ich in den Kommentaren auf diesem Weg suchen Recht auf mich Hat

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

nicht überprüfen

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

Was gibt, dass etwas tut ....

Auch Namespace App ist nicht app für den Ordner seine App, weil dies unter Windows funktionieren kann, aber Sie finden, dass es unter Linux nicht funktioniert. Weil Linux-Pfade Groß- und Kleinschreibung beachten und Windows nicht.

Ferner macht dies wenig bis gar keinen Sinn

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

Erfordern 2 Dateien? Wege funktionieren nicht so, nicht dass ich mir zumindest dessen bewusst bin.

Darüber hinaus ignoriert Ihre Implementierung die _ In der Regel werden Unterstreichungen Teil des Klassennamens sein, aber durch Verzeichnis ersetzt werden, dies ermöglicht einen kürzeren Namensraum. So zum Beispiel, anstatt einen Namensraum zu haben wie diese

 Namespace \APP\Table; 
    class PostsTable .. 

könnten Sie haben eine Klasse an der gleichen Stelle wie so

 Namespace \APP; 
    class Table_PostsTable .. 

Mit einem kürzeren Namensraum, aber immer noch in der App/Table/PostsTable.php Datei. Aber genau so habe ich die Spezifikation für PSR-Autoloader gelesen.

PRO TIP

diesen Weg C:\wamp64\www\blog\appAutoloader.php/Table/PostsTable.php auf Sie Desktop, um die Datei-Browser öffnen und sehen, ob er die Datei zieht, indem sie in der Navigationsleiste einfügen. Es geht nicht, aber Sie können sicher sein, dass Ihr Pfad falsch ist, indem Sie den Code entfernen.

+0

Danke, ich folgte, was Sie gesagt haben, und es geschafft, mein Problem zu beheben :) Vielen Dank auch für Ihre Unterstützung! – Finalmix6

+0

Sehen Sie, ich weiß diese Dinge, weil ich das Rad für Spaß neu erfunden habe und mehrmals profitieren. Nichts ist falsch daran zu lernen, wie diese Dinge funktionieren ... In der Tat lernen PHP, und alle Frameworks fallen zu Ihren Füßen. – ArtisticPhoenix

Verwandte Themen