Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php-自动加载不使用静态方法_Php_Autoload_Spl Autoload Register - Fatal编程技术网

php-自动加载不使用静态方法

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

我使用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 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中出现了相同的错误try
Module\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中的代码也可以通过别名或使用完整的类名访问完全限定的名称。