首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spl_autoloader没有加载任何类

spl_autoloader没有加载任何类
EN

Stack Overflow用户
提问于 2015-02-26 10:02:43
回答 2查看 375关注 0票数 0

因此,我已经开始使用名称空间,并阅读了一些文档,但我似乎做错了什么。

首先是我的应用程序结构,它是这样构建的:

代码语言:javascript
复制
root
-dashboard(this is where i want to use the autoloader)
-index.php
--config(includes the autoloader)
--WePack(package)
---src(includes all my classes)

现在,在src目录中,我包含了以下类:

代码语言:javascript
复制
namespace WePack\src;
class Someclass(){

}

config.php的内容如下:

代码语言:javascript
复制
<?php
// Start de sessie
ob_start();
session_start();

// Locate application path
define('ROOT', dirname(dirname(__FILE__)));
set_include_path(ROOT);
spl_autoload_extensions(".php"); // comma-separated list
spl_autoload_register();
echo get_include_path();

我像这样在我的index.php里用它

代码语言:javascript
复制
require_once ('config/config.php');
use WePack\src;
$someclass = new Someclass;

这是echo get_include_path();返回的内容:

代码语言:javascript
复制
/home/wepack/public_html/dashboard

我猜这就是我想要的。但是这些类没有加载,也没有发生任何事情。我显然遗漏了什么,但我似乎搞不清楚。你们能看看然后向我解释一下为什么这不管用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-02 10:15:02

这里的问题是,您没有向spl_autoload_register()注册回调函数。看看官方的文档

为了更灵活,您可以编写自己的类来注册和自动注册类,如下所示:

代码语言:javascript
复制
class Autoloader
{
    private $baseDir = null;

    private function __construct($baseDir = null)
    {
        if ($baseDir === null) {
            $this->baseDir = dirname(__FILE__);
        } else {
            $this->baseDir = rtrim($baseDir, '');
        }
    }

    public static function register($baseDir = null)
    {
        //create an instance of the autoloader
        $loader = new self($baseDir);

        //register your own autoloader, which is contained in this class
        spl_autoload_register(array($loader, 'autoload'));

        return $loader;
    }

    private function autoload($class)
    {
        if ($class[0] === '\\') {
            $class = substr($class, 1);
        }

        //if you want you can check if the autoloader is responsible for a specific namespace
        if (strpos($class, 'yourNameSpace') !== 0) {
            return;
        }

        //replace backslashes from the namespace with a normal directory separator
        $file = sprintf('%s/%s.php', $this->baseDir, str_replace('\\', DIRECTORY_SEPARATOR, $class));

        //include your file
        if (is_file($file)) {
            require_once($file);
        }
    }
}

在此之后,您将注册您的自动加载器如下:

代码语言:javascript
复制
Autoloader::register("/your/path/to/your/libraries");
票数 4
EN

Stack Overflow用户

发布于 2015-03-02 10:20:00

这不是你的意思吗

代码语言:javascript
复制
spl_autoload_register(function( $class ) {
    include_once ROOT.'/classes/'.$class.'.php';
});

这样,您就可以调用这样的类:

代码语言:javascript
复制
$user = new User(); // And loads it from "ROOT"/classes/User.php
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28739392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档