我对php上的命名空间(> 5.4。*)和作曲家
非常困惑方案
|vendor
|autoload.php
|abkrim
|cputils
|src
|CpPanelBackTest.php
Code 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'今天的日期是:' 。 CpPanelBackTest :: GETDATE();
答案 0 :(得分:1)
当PHP无法加载或查找类时,会触发您遇到的错误。该错误消息中的名称是要搜索的类的完全限定名称。
错误消息中的该名称不包含命名空间。这意味着您的使用未被检测为使用命名空间。如果你看一行,这是正确的:echo 'Date today is: ' . CpPanelBackTest::getDate();
这里没有命名空间。
之前你有一个use
语句,它应该将类导入当前(全局)命名空间。而且我相信它会这样做 - 我的测试显示你问题中发布的代码可能正常工作。问题是:我发现很难用Composer创建一个完整的测试用例,一个单独的包,包括它等等,所以我只运行了一个微小的替换测试,它没有考虑到文件系统的差异。 / p>
<?php
namespace Foo {
class Bar {}
}
namespace {
use Foo\Bar;
var_dump(new Bar);
}
查看实际操作:http://3v4l.org/mrVsI
这是我的猜测:PHP类不区分大小写,但是从类名转换为路径和文件名在某些文件系统上区分大小写。如果您在代码中只输错了一个字母,则Composer将无法检测到前缀和/或无法找到正确的文件。
不幸的是,您没有做正确的测试来证明自动加载是错误的。您应该只删除自动加载器,而是需要包含该类的文件 - 而不禁用命名空间。