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

时间:2017-06-29 14:02:40

标签: php oop autoloader

我的课程遇到了一些问题:他们根本没有加载我的自动加载器。

我收到此消息错误:

  

警告:   需要(C:\ wamp64 \ WWW \博客\ appAutoloader.php /表/ PostsTable.php):   无法打开流:没有这样的文件或目录   第23行的C:\ wamp64 \ www \ blog \ app \ Autoloader.php

     

致命错误:require():需要打开失败   'C:\ wamp64 \ WWW \博客\ appAutoloader.php /表/ PostsTable.php'   (include_path ='。; C:\ php \ pear')in   第23行的C:\ wamp64 \ www \ blog \ app \ Autoloader.php

工厂类

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自动加载器类

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

}
}

命名空间Core自动加载器类

<?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());

如何让它有效?

1 个答案:

答案 0 :(得分:1)

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

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路径区分大小写,而窗口不区分。

此外,这几乎没有任何意义

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

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

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

     Namespace \APP\Table;
     class PostsTable  ..

你可以在同一个地方有一个课程,如此

     Namespace \APP;
     class Table_PostsTable  ..

使用较短的命名空间但仍位于App/Table/PostsTable.php文件中。但是,这就是我如何阅读PSR自动加载器的规范。

专业提示

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