Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.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 如何在我的/Classes/文件夹中使用PSR-4自动加载?_Php_Oop_Autoloader_Psr 4 - Fatal编程技术网

Php 如何在我的/Classes/文件夹中使用PSR-4自动加载?

Php 如何在我的/Classes/文件夹中使用PSR-4自动加载?,php,oop,autoloader,psr-4,Php,Oop,Autoloader,Psr 4,我尝试了多个PSR-4加载程序,但它们要么不工作,要么我无法从另一个文件夹访问这些类 我当前的文件夹结构: -课程 --Config.php --Session.php --前端(文件夹) ---Login.php PSR-4自动装弹机: 我尝试使用PSR-4自动加载寄存器加载所有类。我稍微修改了一下我的文件夹结构。我已经为所有类指定了名称空间类,但Frotend文件夹中的类具有名称空间类\前端 spl\u自动加载\u寄存器(函数($class){ //特定于项目的命名空间前缀 $prefix=

我尝试了多个PSR-4加载程序,但它们要么不工作,要么我无法从另一个文件夹访问这些类

我当前的文件夹结构:

-课程

--Config.php

--Session.php

--前端(文件夹)

---Login.php

PSR-4自动装弹机:

我尝试使用PSR-4自动加载寄存器加载所有类。我稍微修改了一下我的文件夹结构。我已经为所有类指定了名称空间类,但Frotend文件夹中的类具有名称空间类\前端

spl\u自动加载\u寄存器(函数($class){
//特定于项目的命名空间前缀
$prefix='Classes\\';
//命名空间前缀的基目录
$base_dir=_dir__.'/Classes/';
//类是否使用名称空间前缀?
$len=strlen($prefix);
if(strncmp($prefix,$class,$len)!==0){
//否,移动到下一个已注册的自动加载器
返回;
}
//获取相对类名
$relative_class=substr($class$len);
//用基目录替换名称空间前缀,替换名称空间
//在相对类名中带有目录分隔符的分隔符,append
//使用.php
$file=$base\u dir.str\u replace(“\\”、“/”、$relative\u class)。“.php”;
//如果文件存在,则需要它
如果(文件_存在($file)){
需要$file;
}
});
我不确定这是否与autoloader有关,但我还想从任何文件调用该类,无论该类位于何处。所以如果我有一个文件在

/Frontend/templates/login-page.php

我希望能够调用类“Classes\Frontend\Login”


这可能吗?我该怎么做?

主要有两种方法使其工作:第一种方法是使用绝对服务器路径(以“/”开头),在自动加载功能中为类设置基本目录:

spl_autoload_register(function ($class) {

    $prefix = 'Classes\\';
    $base_dir = '/var/www/html/my_project/src/'; // your classes folder
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        return;
    }
    $relative_class = substr($class, $len);
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
    if (file_exists($file)) {
        require $file;
    }
});
更好的解决方案是,正如@Félix所建议的,坚持
\uuuu DIR\uuu
不变,以保持项目文件夹的相关内容。不同服务器上的部署之间的绝对路径很脆弱
\uuuu DIR\uuuuu
是指它所使用的文件的目录;在这种情况下,您可以在这里注册自动加载功能。从这个目录开始,您可以导航到classes base目录,例如
$base\u dir=\uuu dir\uu.'//src/

不要忘记为类命名名称空间:

namespace Classes;

class Foo
{
    public function test()
    {
       echo 'Hurray';
    }
 }
然后使用如下类:

$foo = new Classes\Foo();
$foo->test();

您有吗?请使用
作曲家
!我正在创建某种库,这种库应该很容易在其他项目中实现。使用composer不是一个选项。我一直在为一个独立的项目使用composer,这就是为什么没有composer我不知道如何正确地执行此操作。如果您正在创建一个库而不使用
composer
,那么您将是唯一使用该库的人。啊,是的。我完全忘了我的文件在别的地方。但我仍然无法在位于其他地方的文件中使用我的类。现在正在index.php(项目的根目录)中进行自动加载。我可以在(例如)/etc/test.php中很好地接近这些类。但是,当我在/Frontend/templates/pages/test.php中使用相同的类时,我得到一个错误,该类找不到,我必须手动要求它。有什么解决方法吗?您确定使用了以反斜杠开头的绝对路径吗?这应该独立于调用脚本的文件夹工作。