ZF2命名空间和文件系统

时间:2013-11-12 03:50:41

标签: php namespaces zend-framework2 autoload

我在ZF2中有标准的应用程序模块。它是默认配置的,我没有改变任何东西。我刚刚添加了一些内容:

module/
  Application/
    src/
      Application/
        Entity/
          Product/
            **Product.php**        
        Controller/
          **IndexController.php**

Product.php

namespace Application\Entity;

class Product
{

}

IndexController.php

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Application\Entity\Product;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {       
        $product = new Product();   
    }
}

我收到以下错误:

Fatal error: Class 'Application\Entity\Product' not found in \module\Application\src\Application\Controller\IndexController.php on line 20

我使用相同的命名空间,但它没有看到它。为什么呢?

P.S:如果我将Product.php更改为以下内容:

namespace Application\Entity\Product;

class Product
{

}

然后在IndexController.php中,以下代码将起作用:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Application\Entity\Product\Product;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {       
        $product = new Product();   
    }
}

更新 我看到我必须遵循PSR-0标准,但你能解释一下,这个标准是来自php核心还是只是在ZF2框架中实现的功能? 我也可以改变这种行为吗?我不是说它很好,我只是想知道它是如何工作的! 例如,我想使用Application \ Entity \ Product和Product类位于/Application/Entity/Product/Product.php中。提前谢谢!

2 个答案:

答案 0 :(得分:1)

如果将类Product放在命名空间Application\Entity中,那么您的目录结构应该是

module/
  Application/
    src/
      Application/
        Entity/
          **Product.php**

另见PSR-0

答案 1 :(得分:0)

你应该遵循PSR-2。 因此,正确的命名空间实际上是您当前文件夹结构的“Application \ Entity \ Product”。 这意味着你必须做

new \Application\Entity\Product\Product;

use Application\Entity\Product\Product;
new Product;

如果您只想要它是Application \ Entity \ Product,那么您应该将文件移动到'Entity'文件夹