spl_autoloader 未加载任何 类
spl_autoloader not loading any classes
所以我开始使用命名空间并阅读了一些文档,但我似乎做错了什么。
首先是我的应用程序结构,它是这样构建的:
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 目录中我包含了 类 和:
namespace WePack\src;
class Someclass(){
}
config.php的内容是:
<?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
中这样使用它
require_once ('config/config.php');
use WePack\src;
$someclass = new Someclass;
这就是回显get_include_path(); returns:
/home/wepack/public_html/dashboard
我猜这就是我想要的。但是 类 没有加载并且什么也没有发生。我显然遗漏了一些东西,但我似乎无法弄清楚。你们能看看它并向我解释为什么这不起作用吗?
这里的问题是,您没有使用 spl_autoload_register()
注册回调函数。看看官方docs.
为了更加灵活,您可以编写自己的 class 来注册和自动加载 classes,如下所示:
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);
}
}
}
之后,您将像这样注册您的自动加载器:
Autoloader::register("/your/path/to/your/libraries");
你是不是这个意思:
spl_autoload_register(function( $class ) {
include_once ROOT.'/classes/'.$class.'.php';
});
这样你就可以像这样调用 class:
$user = new User(); // And loads it from "ROOT"/classes/User.php
所以我开始使用命名空间并阅读了一些文档,但我似乎做错了什么。
首先是我的应用程序结构,它是这样构建的:
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 目录中我包含了 类 和:
namespace WePack\src;
class Someclass(){
}
config.php的内容是:
<?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
中这样使用它require_once ('config/config.php');
use WePack\src;
$someclass = new Someclass;
这就是回显get_include_path(); returns:
/home/wepack/public_html/dashboard
我猜这就是我想要的。但是 类 没有加载并且什么也没有发生。我显然遗漏了一些东西,但我似乎无法弄清楚。你们能看看它并向我解释为什么这不起作用吗?
这里的问题是,您没有使用 spl_autoload_register()
注册回调函数。看看官方docs.
为了更加灵活,您可以编写自己的 class 来注册和自动加载 classes,如下所示:
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);
}
}
}
之后,您将像这样注册您的自动加载器:
Autoloader::register("/your/path/to/your/libraries");
你是不是这个意思:
spl_autoload_register(function( $class ) {
include_once ROOT.'/classes/'.$class.'.php';
});
这样你就可以像这样调用 class:
$user = new User(); // And loads it from "ROOT"/classes/User.php