gpt4 book ai didi

php - PSR-0 自动负载测试问题

转载 作者:行者123 更新时间:2023-12-04 16:51:27 24 4
gpt4 key购买 nike

我正在摆弄自动加载,并试图制作一个符合 PSR-0 标准的文件结构。但是我收到此错误:
Warning: require(GetMatchHistory\api.php): failed to open stream: No such file or directory in C:\xampp\htdocs\Test\Test.php on line 15Fatal error: require(): Failed opening required 'GetMatchHistory\api.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\Test\Test.php on line 15
这是我的文件结构:

File structure

我正在使用带有此自动加载程序功能的测试 PHP:

function autoload($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

require $fileName;
}

spl_autoload_register('autoload');

$Query = new GetMatchHistory_api();

此函数是从建议的 PSR-0 函数 here 复制粘贴的

我是否误解了结构应该如何? “api.php”中的类是 GetMatchHistory_api
编辑:另一个问题

我已经使用了 MrCode 的建议答案,但是现在我遇到了一个问题,即自动加载器无法加载另一个目录中的类。
use Classes\Queries\History\GetMatchHistoryAPI;
use Classes\Queries\History\GetMatchHistoryBASE;
use Classes\Utilities\send;

当我调用 send类,来自 GetMatchHistoryAPI 内部的函数,我收到错误:
Warning: require(Classes\Queries\History\send.php): failed to open stream: No such file or directory in C:\xampp\htdocs\Test\Test.php on line 15
但是,从上图中可以看出,发送类不在该文件路径中。为什么会发生此错误?

最佳答案

基于该结构,您需要将该类重命名为 Classes_Queries_GetMatchHistory_api并将实例化它的代码更改为:

$Query = new Classes_Queries_GetMatchHistory_api();

造成这种情况的原因是您的 Test.php驻留在根目录下,api 类在目录 Classes/Queries/GetMatchHistory 中.

使用命名空间而不是下划线方法的示例:

api.php:
namespace Classes\Queries\GetMatchHistory;

class api
{

}

测试.php:
spl_autoload_register('autoload');
$Query = new Classes\Queries\GetMatchHistory\api();

或使用 use :
use Classes\Queries\GetMatchHistory\api;

spl_autoload_register('autoload');
$Query = new api();

要解决您的评论:

I was going to have the same class names, but under a different folder (so GetMatchHistory - api.php and GetMatchDetails - api.php). I guess this would make it too ambiguous when calling the classes however



命名空间旨在解决这个问题。命名空间允许您拥有同名的类(但在不同的命名空间中)并避免任何冲突。

例如,您有一个 api两者下的类 GetMatchHistoryGetMatchDetails .

文件:类/查询/GetMatchHistory/api.php
namespace Classes\Queries\GetMatchHistory;

class api
{
public function __construct(){
echo 'this is the GetMatchHistory api';
}
}

文件:类/查询/GetMatchDetails/api.php
namespace Classes\Queries\GetMatchDetails;

class api
{
public function __construct(){
echo 'this is the GetMatchDetails api, I am separate to the other!';
}
}

文件:Test.php(使用示例)
spl_autoload_register('autoload');

$historyApi = new Classes\Queries\GetMatchHistory\api();
$detailsApi = new Classes\Queries\GetMatchDetails\api();

如果你愿意,你可以给一个别名而不是输入整个完全限定的命名空间:
use Classes\Queries\GetMatchHistory\api as HistoryApi;
use Classes\Queries\GetMatchDetails\api as DetailsApi;

$historyApi = new HistoryApi();
$detailsApi = new DetailsApi();

如您所见,命名空间可以让多个不同的类具有相同的名称,而不会产生冲突或使其产生歧义。

关于php - PSR-0 自动负载测试问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22349373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com