面向对象 PHP 自动加载器问题

Oriented Object PHP autoloader issue

我的 classes 遇到了一个小问题:它们根本无法通过我的自动加载器加载。

我收到此消息错误:

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


工厂class

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

命名空间应用自动加载器class:

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

}
}

命名空间核心自动加载器class:

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

}
}

空 PostTable

namespace App\Table;

use Core\Table\Table;

class PostsTable extends Table
{

}

索引页 :

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

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

请问如何实现?

正如我在评论中所说,请检查此路径

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

我觉得不对

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

那位在那里做什么....

App 的命名空间也不是 app 文件夹的 App 因为这可能适用于 Windows 但你会发现它不适用于 Linux。因为 Linux 路径区分大小写,而 windows 不区分大小写。

此外,这几乎没有意义

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

需要2个文件?路径不是那样工作的,至少我不知道。

最重要的是,您的实现会忽略 _ 通常,下划线将成为 class 名称的一部分,但会被目录替换,这允许使用更短的命名空间。因此,例如,而不是像这样的名称空间

     Namespace \APP\Table;
     class PostsTable  ..

你可以在同一个地方有一个 class 像这样

     Namespace \APP;
     class Table_PostsTable  ..

命名空间较短,但仍位于 App/Table/PostsTable.php 文件中。然而,这正是我阅读 PSR 自动加载器规范的方式。

专业提示

选择此路径 C:\wamp64\www\blog\appAutoloader.php/Table/PostsTable.php 打开桌面上的文件浏览器,看看它是否通过将文件粘贴到导航栏来拉出文件。它不会,但是您可以通过删除代码来确定您的路径是错误的。