当前位置: 首页 > 知识库问答 >
问题:

PHP Autoload类无法使用名称空间

卫鸿朗
2023-03-14

我试着写了下面的代码,但不明白为什么它在spl_autoload_register()中找不到具有名称空间的类?

我得到的错误是:

警告:require_once(src/test\stringhelper.php):无法打开流:没有这样的文件或目录

autoloader.php文件:

<?php

spl_autoload_register(function($classname){
    require_once "src/$classname.php"; // NOT WORKING DYNAMICALLY

//    require_once "src/StringHelper.php"; // WORKING WHEN HARD CODED
});

$stringHelper1 = new test\StringHelper(); // Class with namespace defined
echo $stringHelper1->hello() . PHP_EOL; // returns text

src文件夹中的stringhelper.php:

<?php namespace test;

class StringHelper{

    function hello(){
        echo "hello from string helper";
    }
}

我也在使用XAMPP,如果这有区别的话。

共有1个答案

景河
2023-03-14

如前所述,您需要除去类名以外的所有内容,如下所示:

$classname = substr($classname, strrpos($classname, "\\") + 1);

在自动加载功能的上下文中:

spl_autoload_register(function($classname){

    $classname = substr($classname, strrpos($classname, "\\") + 1);
    require_once "src/{$classname}.php"; 
});

目前,如前所述,您正在将完全限定的名称(test\stringhelper)传递给您的自动加载函数,该函数又尝试从匹配的文件路径中require_once(src/test/stringhelper.php)。由于该位置没有文件,任何加载它的尝试都将失败,因此出现错误。

 类似资料:
  • 问题内容: 我在命名空间和语句上遇到了一些麻烦。 我有三个文件:,和。 我正在尝试使用相对路径进行此操作,因此已将其放在所有类中: 在我的圈子课程中,我有以下内容: 如果使用这些语句,我不会出错。如果我尝试以下语句,则会得到: 致命错误:在第8行的/Users/shawn/Documents/work/sites/workspace/shape/Circle.php中找不到类’Shape \ Sh

  • 问题内容: 想知道是否有人在使用新功能通过PHP 5.3对类进行命名空间时是否遇到了此问题。 我正在使用单独的类来生成动态类调用,以在应用程序中定义用户类型。基本上,类定义器采用类型的整数表示形式并解释它们,返回一个包含要用作该用户模型的类名的字符串。 我在全局范围内定义了具有该名称的用户类型的对象模型,但是在Editor名称空间中,该用户的编辑器具有另一个名称相同的对象。由于某些原因,PHP不允

  • 问题内容: 当我在下面尝试添加为属性时,我正在创建Atom供稿- 我将此作为输出- 部分被切断。我需要转义- 字符吗?还是他们以其他方式添加此命名空间? 问题答案: 如果要从名称空间/前缀向$ node 添加属性,则无需事先声明名称空间。只需使用addAttribute()的第三个参数为您在第一个参数中使用的前缀提供名称空间uri。 版画 如果不需要属性本身,则可以使用删除它,而保留名称空间声明。

  • 我得到了(超过)两个Api POSTendpoint。每一个都需要一个json作为参数。但是当我在两个endpoint参数类中使用相同的类名负载时,Swagger就不起作用了。当我改变其中的一个,例如从有效载荷到有效载荷1时,它就不起作用了。当然,我在包装类中设置了正确的名称空间,以便它找到负载。但我希望每次都使用相同的名称“有效载荷”。如何使用相同的类名负载?在这两种情况下,我都可以保留json

  • 在OpenFOAM中,存在一个函数,其名称为exp,表示数学中的幂操作。同时,C++本身也可以进行这个计算,并且函数名称也为exp。这会导致调用的时候,编译器并不知道应该调用OpenFOAM的exp还是C++本身的exp。一种方法是将其中一个exp函数进行改名,比如将OpenFOAM中的exp改成expFoam。但还有更简单的方式。 名称空间专门用于解决上面的问题,它可作为附加信息来区分不同库中相

  • 问题内容: 有什么办法可以将Swift类型名称作为带有名称空间(或框架名称)的字符串? 例如,如果有一个名为的类,我想获取类似的字符串。 以下仅返回类名。 我还想获得框架名称作为名称空间。 问题答案: 用途: 从Xcode 7发行说明 : 默认情况下,现在可以打印类型名称和枚举大小写,并将其转换为String而不带限定符。或仍可用于获取完全限定的名称。