php中的命名空间和类加载

时间:2015-04-20 18:37:06

标签: php namespaces

我是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();
   } 

}

3 个答案:

答案 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调用注册了自动加载功能,因此在实例化类时,它将使用自动加载功能来检索类定义。