繁体   English   中英

在 PHP 上使用命名空间兼容 PSR-4 找不到类

[英]Class not found using namespace compilant PSR-4 on PHP

我对 php (>5.4.*) 和 composer 上的命名空间感到非常困惑

设想

|vendor
   |autoload.php
    |abkrim
       |cputils
          |src
             |CpPanelBackTest.php

代码 CpPanelBackTest.php

namespace Abkrim\Cputils;
class CpPanelBackTest
{
    public static function getDate(){
      $year = date('Y');
      $month = date('m');
      $day = date('d');
      return $day . '/' . $month . '/' . $year;
    }
}

文件 test.php

require __DIR__.'/../../vendor/autoload.php';
use Abkrim\Cputils\CpPanelBackTest;
echo 'Date today is: ' . CpPanelBackTest::getDate();

在 vendor/abkrim/cputils 上文件 composer.json

"autoload": {
   "psr-4": {
      "Abkrim\\Cputils\\": "src/"
   }
}

获取错误->

PHP Fatal error:  Class 'CpPanelBackTest' not found in at file xxxx line xxxx

如果更改 CpPanelBackTest.php 的代码

//namespace Abkrim\Cputils; //coment namespace
class CpPanelBackTest
{
    public static function getDate(){
      $year = date('Y');
      $month = date('m');
      $day = date('d');
      return $day . '/' . $month . '/' . $year;
    }
}

和文件 test.php

//require __DIR__.'/../../vendor/autoload.php';
//use Abkrim\Cputils\CpPanelBackTest;
require_once __DIR__ . '/../../vendor/abkrim/cputils/src/CpPanelBackTest.php';

现在工作正常。

我迷路了。 我对此一无所知 echo 'Date is: ' 。 CpPanelBackTest::getDate();

当 PHP 无法加载或找不到类时会触发您遇到的错误。 该错误消息中的名称是正在搜索的类的完全限定名称。

错误消息中的该名称不包含命名空间。 这意味着您的使用未被检测为使用命名空间。 如果您查看一行,这是正确的: echo 'Date today is: ' . CpPanelBackTest::getDate(); echo 'Date today is: ' . CpPanelBackTest::getDate(); 这里没有命名空间。

在此之前确实有一个use语句,它应该将类导入到当前(全局)命名空间中。 而且我相信它会做到这一点 - 我的测试表明您问题中发布的代码可能会正确工作。 问题是:我发现很难用 Composer 创建一个完整的测试用例,一个单独的包,包括它等等,所以我只运行了一个很小的替换测试,它没有考虑到文件系统的差异。

<?php

namespace Foo {
class Bar {}
}

namespace {
use Foo\Bar;
var_dump(new Bar);
}

看到它在行动:http: //3v4l.org/mrVsI

这是我的猜测:PHP 类不区分大小写,但在某些文件系统上,从类名到路径和文件名的转换是区分大小写的。 如果您在代码中只输入了一个字母,Composer 将无法检测到前缀和/或将无法找到正确的文件。

不幸的是,您没有进行正确的测试来证明自动加载是错误的。 您应该只删除自动加载器,而是需要包含该类的文件 - 而不禁用命名空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM