我是PHP的名称空间的新手,并试图利用它们来加载类。
每当我运行我的代码时,我都会得到class Cheese cannot be found on line x
PHPstorm
通过命名空间识别该类并启用其方法。
我有以下文件/目录结构。
/Project
/App
Mouse.php
/Test
MouseTest.php
Mouse.php
namespace App\Mouse;
class Cheese
{
}
MouseTest.php
namespace Test\MouseTest;
use \App\Mouse\Cheese as Cheese;
class CheeseTest
{
function test() {
$cheese = new Cheese();
$cheese->eat();
}
}
答案 0 :(得分:1)
如果您使用composer
或跟随psr-0的任何自动加载器,则文件名必须与类名相同,请将Mouse.php
更改为Cheese.php
答案 1 :(得分:0)
PHP命名空间不会自动加载类,您必须包含它们的文件。
要使其自动化(您想要),您必须制作自动加载器,这将根据您要使用的命名空间加载类。
最好的方法是使用作曲家:http://code.tutsplus.com/tutorials/easy-package-management-with-composer--net-25530
但我建议在谷歌搜索“php auloader”
答案 2 :(得分:0)
这看起来与PSR0标准的结构类似:http://www.php-fig.org/psr/psr-0/
这是遵循该结构的示例自动加载器:
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');
spl_autoload_register调用注册了自动加载功能,因此在实例化类时,它将使用自动加载功能来检索类定义。