我的课程遇到了一些问题:他们根本没有加载我的自动加载器。
我收到此消息错误:
警告: 需要(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());
如何让它有效?
答案 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
打开桌面上的文件浏览器,看看它是否通过将文件粘贴到导航栏中来提取文件。它不会,但你可以通过消除代码来确定你的路径是错误的。