1

我已经创建了我的代码,因为 ZF2 推动你这样做,现在我开始认为它实际上违背了首先使用命名空间的全部意义/好处。

我想改变一切,但我害怕以自己的方式去做,因为 ZF 自己并没有这样做,所以我觉得我必须错过一件重要的事情。

我的文件夹/文件结构是这样的:

- Application
    - Controller
        IndexController.php
    - Model
        - Table
            User.php
            Building.php
        - Mapper
            User.php
            Building.php
        - Entity
            User.php
            Building.php

所以在我的控制器中,代码可能看起来像这样,正如 ZF2 建议你开始的那样:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel;

use Application\Model\Entity\User as UserEntity,
    Application\Model\Mapper\User as UserMapper,
    Application\Model\Table\User as UserTable;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new UserEntity;
        $userMapper = new UserMapper;
        $userTable = new UserTable;

就在那里,我只给出了一些项目,但是随着您的应用程序的增长,您最终会得到一个巨大的 use 语句,看起来应该更像下面这样:

namespace Application;

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel;

use Model;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new Entity\User;
        $userMapper = new Mapper\User;
        $userTable = new Table\User;

我猜这是因为 ZF2 正在推动基于模块化的项目,这些项目有很多模块。但是如果需要,我可以肯定地放入该模块的命名空间吗?我仍然需要使用当前使用的更多限定名称来执行此操作。

4

1 回答 1

7

声明是导入一个命名空间,use关于如何&何时导入,没有编码标准。

您必须记住两件事:

  1. 是的,许多类(或命名空间)的使用可能会变得过于复杂。因此,我通常会导入一个命名空间,而不是显式导入类。示例在此处(用于模块功能)、此处(用于自动加载)和此处(用于异常)。如您所见,它是 FQCN 和命名空间的混合体。
  2. 如果您害怕“如果您的应用程序增长”:请考虑类,因为它们封装了责任。如果您的班级有多个职责,请将其分成两个班级。然后您还会注意到您导入的命名空间的数量会减少。

顺便说一句,有一个usePSR-2 指南规定使用语句必须以;每次使用结束。所以不是这个:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel;

use Application\Model\Entity\User as UserEntity,
    Application\Model\Mapper\User as UserMapper,
    Application\Model\Table\User as UserTable;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new UserEntity;
        $userMapper = new UserMapper;
        $userTable = new UserTable;
    }
}

但是这个:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use Application\Model\Entity\User as UserEntity;
use Application\Model\Mapper\User as UserMapper;
use Application\Model\Table\User as UserTable;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new UserEntity;
        $userMapper = new UserMapper;
        $userTable = new UserTable;
    }
}

所以你可以清理一下:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use Application\Model;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new Model\Entity\User;
        $userMapper = new Model\Mapper\User;
        $userTable = new Model\Table\User;
    }
}

如果您想使用自己的实体和映射器,但使用来自不同模块的表,则代码将被重构为:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use Application\Model;
use OtherModule\Model\Table\User as UserTable;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new Model\Entity\User;
        $userMapper = new Model\Mapper\User;
        $userTable = new UserTable;
    }
}
于 2012-11-04T09:15:09.093 回答