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