php-自动加载不使用静态方法
我使用spl_autoload_寄存器自动加载类,如 我的结构php-自动加载不使用静态方法,php,autoload,spl-autoload-register,Php,Autoload,Spl Autoload Register,我使用spl_autoload_寄存器自动加载类,如 我的结构 index.php Module\Autoloader.php Module\MyClass.php Test\test.php 在index.php文件中 require_once ("Module\Autoloader.php"); use Module\MyClass; include 'Test\test.php'; class Autoloader { static public function lo
index.php
Module\Autoloader.php
Module\MyClass.php
Test\test.php
在index.php
文件中
require_once ("Module\Autoloader.php");
use Module\MyClass;
include 'Test\test.php';
class Autoloader {
static public function loader($className) {
$filename = __DIR__."/" . str_replace("\\", '/', $className) . ".php";
echo $filename.'<br>';
if (file_exists($filename)) {
include($filename);
}
}
}
spl_autoload_register('Autoloader::loader');
namespace Module;
class MyClass {
public static function run() {
echo 'run';
}
}
MyClass::run();
在Module\Autoloader.php
文件中
require_once ("Module\Autoloader.php");
use Module\MyClass;
include 'Test\test.php';
class Autoloader {
static public function loader($className) {
$filename = __DIR__."/" . str_replace("\\", '/', $className) . ".php";
echo $filename.'<br>';
if (file_exists($filename)) {
include($filename);
}
}
}
spl_autoload_register('Autoloader::loader');
namespace Module;
class MyClass {
public static function run() {
echo 'run';
}
}
MyClass::run();
在Test\Test.php
文件中
require_once ("Module\Autoloader.php");
use Module\MyClass;
include 'Test\test.php';
class Autoloader {
static public function loader($className) {
$filename = __DIR__."/" . str_replace("\\", '/', $className) . ".php";
echo $filename.'<br>';
if (file_exists($filename)) {
include($filename);
}
}
}
spl_autoload_register('Autoloader::loader');
namespace Module;
class MyClass {
public static function run() {
echo 'run';
}
}
MyClass::run();
但它有错误
Fatal error: Uncaught Error: Class 'MyClass' not found in ..\Test\test.php
如何解决这个问题,谢谢你的问题是你预先准备了
\uuuuu DIR\uuuuu
\uuuu DIR\uuuu
基于调用它的文件所在的位置:
\uuuuu目录
文件的目录如果在include中使用,则返回包含文件的目录。这相当于dirname(\uuuuu file\uuuu
)。此目录名后面没有斜杠,除非它是根目录
因为您的自动加载程序驻留在./Module中/
当从index.php调用时,\uuuuuu DIR\uuuu
将不会返回/
,而是模块
,使您完成的类路径模块/Module/MyClass.php
显然无法找到
使用另一种方法预先设置目录,如预先确定的列表,使用名称空间的第一部分(因此只需丢弃
\uuuu DIR\uuuu
),或者将类移动到相对于包含文件所在目录的位置。您的自动加载程序位于模块目录内,因此它将应用额外的“模块”当您尝试将“DIR”附加到类全名时。文件位置如下所示:
../Module/Module/MyClass.php
尝试将自动加载器移动到与index.php相同的目录,或按以下方式进行更改:
<?php
class Autoloader {
static public function loader($className) {
$filename = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR .
str_replace("\\", DIRECTORY_SEPARATOR, $className) . ".php";
if (file_exists($filename)) {
include($filename);
} else {
echo "$filename not found!\n";
}
}
}
spl_autoload_register('Autoloader::loader');
Output$filename
,检查它是否正确,并指向现有文件。@NigelRen是,但尝试了相同的错误spl_autoload_寄存器('loader')
?@u_mulder我只是使用require autoload编辑我的代码,输出是Module/MyClass.php
,但在test.php中出现了相同的错误tryModule\MyClass::run()
。我尝试了你的建议,但不起作用。我想当我回显。\test\Module/MyClass.php
时,MyClass
已经被b/c加载了,这是正确的路径。但是仍然得到致命错误致命错误:未捕获错误:在..\test\test\test.php中找不到类“MyClass”
我不这么认为。在我的行中,echo$filename.
它回显正确。\test\Module/MyClass.php
但出现致命错误致命错误:未捕获错误:在..\test\test\test.php中找不到类“MyClass”。php
您仍然需要使用Module\MyClass
或将其称为Module\MyClass
正确命名的要求没有改变。对不起,我不明白,我有使用Module\MyClass
在我的index.php
中,该别名用于该文件(index.php)的上下文中。因此,在test.php文件的上下文中,您需要再次发出use语句或指定完全分类的名称。(即使包括它)它不一定是多余的,它只是在index.php文件中的代码上下文中使用。您只需要确保test.php中的代码也可以通过别名或使用完整的类名访问完全限定的名称。