2017-06-29 23 views
0

我encounterd我班一个小问题:他们根本就没有经过我的自动加载磁带机加载。面向对象PHP自动加载问题

我得到这个消息的错误:

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


工厂类

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

命名空间应用程序自动加载类

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

} 
} 

命名空间的核心自动加载类

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

你为什么不使用作曲家? – DaAmidza

+1

我同意@Arslan.H--没有理由不使用作曲家,因为你可以永远忘记自动加载问题。如果你决定走自己的路线,我会祝你好运,整理出来。请记住 - 没有必要重新发明轮子。 – Mjh

+0

我不同意,如果你想知道一个轮子是如何工作的,那么你自己创造一个轮子,重新发明任何东西都没有错。 – ArtisticPhoenix

回答

1

正如我在评论说,检查这条道路

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

不右看看我

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

那是什么做一点有....

另外的命名空间Appapp文件夹及其App,因为这可能会在Windows上工作,但你会发现它并没有在Linux上运行。因为Linux路径区分大小写,而Windows不区分大小写。

而且这使得几乎没有任何意义

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自动加载器的规格。

PRO提示

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

+0

谢谢我跟着你说的,并设法解决我的问题:) 感谢他人以及您的支持! – Finalmix6

+0

看到我知道这些事情,因为我已经重新发明了车轮以获得乐趣并多次获利。学习这些东西如何工作没什么问题......实际上学习PHP,所有的框架都落在了你的脚下。 – ArtisticPhoenix