面向对象 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
打开桌面上的文件浏览器,看看它是否通过将文件粘贴到导航栏来拉出文件。它不会,但是您可以通过删除代码来确定您的路径是错误的。
我的 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
打开桌面上的文件浏览器,看看它是否通过将文件粘贴到导航栏来拉出文件。它不会,但是您可以通过删除代码来确定您的路径是错误的。