ZF2/PHP名称空间-哪个更快/更好?

ZF2/PHP名称空间-哪个更快/更好?,php,zend-framework2,Php,Zend Framework2,我在ZF2的推动下创建了我的代码,现在我开始认为它实际上违背了使用名称空间的全部要点/好处 我想改变一切,但我害怕按照我的方式去做,因为采埃孚自己并没有这样做,所以我觉得我必须错过一件重要的事情 我的文件夹/文件结构如下: - Application - Controller IndexController.php - Model - Table User.php Building.php

我在ZF2的推动下创建了我的代码,现在我开始认为它实际上违背了使用名称空间的全部要点/好处

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

我的文件夹/文件结构如下:

- 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正在推动有很多模块的基于模块的项目。但如果需要的话,我肯定可以直接插入该模块的名称空间?我仍然需要使用当前使用的更多限定名称来实现这一点。

use语句用于导入名称空间,并说明如何导入以及何时导入,没有编码标准

有两件事你必须记住:

是的,许多类或名称空间的使用可能会变得太复杂。因此,我通常导入名称空间,而不显式导入类。例如模块功能、自动加载和异常。如您所见,它是FQCN和名称空间的混合体。 如果您担心应用程序是否会增长:请考虑类,因为它们封装了责任。如果你的班级有不止一个职责,那么把它分成两个班级。然后,您还将注意到导入的名称空间数量将减少。 顺便说一下,有一个use PSR-2指南,规定use语句必须以结束;每一次使用。所以不是这样:

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;
    }
}
use语句用于导入名称空间,并说明如何导入以及何时导入,没有编码标准

有两件事你必须记住:

是的,许多类或名称空间的使用可能会变得太复杂。因此,我通常导入名称空间,而不显式导入类。例如模块功能、自动加载和异常。如您所见,它是FQCN和名称空间的混合体。 如果您担心应用程序是否会增长:请考虑类,因为它们封装了责任。如果你的班级有不止一个职责,那么把它分成两个班级。然后,您还将注意到导入的名称空间数量将减少。 顺便说一下,有一个use PSR-2指南,规定use语句必须以结束;每一次使用。所以不是这样:

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;
    }
}

另外,为每个导入的类使用单独的use语句的优点是,您可以准确地看到您有哪些依赖项。我同意Jurian的观点,如果列表太长,那么类可能有太多的责任。此外,为每个导入的类提供单独的use语句的好处是,您可以准确地看到您有哪些依赖项。我同意Jurian的观点,如果列表太长,那么这个类可能有太多的责任。