我应该如何以及在何处使用 php 中的关键字 "use"

How and where should I use the keyword "use" in php

我通常在class 定义之上使用关键字"use"。像这样:

<?php
namespace suites\plugins\content\agpaypal;
use \Codeception\Util\Fixtures;
use \Codeception\Verify;
use \Codeception\Specify;

class agpaypalTest extends \Codeception\Test\Unit
{
    protected $tester;
    ...

但现在我意识到,我必须将特征指定行放入 class 定义中。像这样:

 <?php
namespace suites\plugins\content\agpaypal;
use \Codeception\Util\Fixtures;
use \Codeception\Verify;

class agpaypalTest extends \Codeception\Test\Unit
{
    use \Codeception\Specify;

    protected $tester;
    ...

我认为是因为包\Codeception\Specify;是一种特质。但是我不明白为什么我在设置线路时不能重用这个特性 使用 \Codeception\Specify; 在 class 定义之前?

如果有人能给我提示或解释,向我解释我应该在哪里使用关键字 "use" 最好,我会很高兴。

您无法使用 use 关键字导入 class。您必须使用 include/require 语句。即使你使用一些 php 自动加载器,自动加载器仍然必须在内部使用 includerequire

使用关键字的目的:

考虑这样一种情况,您有两个 class 同名;您会觉得很奇怪,但是当您使用大型 MVC 结构时,就会发生这种情况。因此,如果您有两个同名的 classes,请将它们放在不同的名称空间中。现在考虑当你的自动加载器正在加载两个 classes(由 require 执行)时,你将要使用 class 的对象。在这种情况下,编译器会混淆要在两个对象中加载哪个 class 对象。为了帮助编译器做出决定,您可以使用 use 语句,以便它可以决定将使用哪个。

这里参考这个 How does the keyword 'use' work

在PHP中,关键字use被用在3种情况下:

  1. As class 名称别名 - 简单地声明 class 的简称(必须在 class 定义的 外部 声明) (manual: Using namespaces: Aliasing/Importing )
  2. 向 class 添加特征(必须在 class 定义的 内部 (顶部)声明 (manual: Traits)
  3. 在匿名函数定义中传递函数内部变量 (manual: Anonymous functions)

use 基本上是在文件中包含一个 class 来使用它。 有两种方法可以将 class 文件包含在另一个文件中。 最通用的是 requireinclude 方法。另一种方法是使用作曲家。假设这个目录结构

Project
  |
  |--- Folder A
  |      |
  |      |---UserRegistration.php
  |
  |---Example
         |
         |--TestUserRegistration.php    

文件夹A中有UserRegistartion.php,你想使用TestUserRegistration.php中的代码在UserRegistration.php中可以是classtraitInterface

方法一.

TestUserRegisteration.php 中,您可以 includerequire 文件 UserRegistartion.php
并使用它

方法二

使用作曲家。在 UserRegistration.php 中,您将 namespace FolderA; 定义为第一行代码。然后像你一样写你的代码。所以现在你想在TestUserRegistration.php中使用这个文件

include vendor/autoload.php;
use FolderA\UserRegistration;

哪个更好,为什么?

方法 2 使用 composer 是最好的方法。在方法 1 中,无论您要包含 UserRegistration 的什么地方,都必须找到 UserRegistration 文件的相对路径。因此,假设有一天您需要更改您的应用程序的目录结构,因为您提供的相对路径现在不存在。

但是在方法2中你总是使用你提供的命名空间\文件名而不是你想使用的地方。因此,即使您更改了目录结构,也不必获取所有代码并修改路径。它会像以前一样工作。 要了解更多有关如何使用 namespacecomposer.

的研究