我首先要通过展示我的代码开始,为了学习,我试图保持简单。
我的代码
index.php -
require('autoloader.php');
$hammer = new Acme\Tools\Hammer();
autoloader.php -
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});
Hammer.php -
namespace Acme\Tools;
class Hammer
{
public function useTool()
{
echo 'You start using the hammer!';
}
}
我的问题/错误消息
警告:include(Acme \ Tools \ Hammer.php):无法打开流:否 第4行的C:\ xampp \ htdocs \ php \ autoloader.php中的此类文件或目录
警告:include():无法打开' Acme \ Tools \ Hammer.php'对于 包含(include_path =' C:\ xampp \ php \ PEAR')in 第4行的C:\ xampp \ htdocs \ php \ autoloader.php
致命错误:未捕获错误:类' Acme \ Tools \ Hammer'找不到 C:\ xampp \ htdocs \ php \ index.php:5堆栈跟踪:#0 {main}抛出 第5行的C:\ xampp \ htdocs \ php \ index.php
我最初使用'使用'索引中的语句如下,但改变了它认为它会有所帮助。
旧的index.php -
use Acme\Tools;
require('autoloader.php');
$hammer = new Tools\Hammer();
有谁知道为什么不工作?
答案 0 :(得分:2)
您的自动加载器假设完整的类名是类文件的完整路径。您需要在其前面加上类路径的根目录。此示例中的__DIR__
假定类路径从运行脚本的位置开始,但您需要更改它以反映正确的路径:
spl_autoload_register(function ($class_name) {
include __DIR__ . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $class_name) . '.php';
});
这是一个非常原始的自动加载器示例。如果您想使用当前建立的自动加载方法,请对Composer进行一些研究。
答案 1 :(得分:0)
当所有人都在同一个目录时: 剥去整个名称空间
spl_autoload_register(function ($class_name) {
$file = preg_match('#[^\\](.*)$#', $class_name, $a);
include $a[1] . '.php';
});
如果将文件放在/acme/Tools/Hammer.php中,会更有意义
答案 2 :(得分:0)
上面只是@Flosculus答案的一小部分:
/**
* our register function :
* requires that anything that is 'name spaceable' be in a
* php file, one per item.
*
* requires that the directory structure matches EXACTLY (case)
* the namespace requirement.
*
*/
spl_autoload_register(
function ($name) {
$name = str_replace("\\" , DIRECTORY_SEPARATOR , $name);
$fqn = __DIR__ . "/" . $name . ".php";
/** @noinspection PhpIncludeInspection */
require_once $fqn;
}
);
打破时,这是我在调试会话窗口中得到的