Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何以及在何处使用关键字;使用「;在php中_Php_Class_Namespaces_Traits_Codeception - Fatal编程技术网

我应该如何以及在何处使用关键字;使用「;在php中

我应该如何以及在何处使用关键字;使用「;在php中,php,class,namespaces,traits,codeception,Php,Class,Namespaces,Traits,Codeception,我通常在类定义上面使用关键字“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; ... <

我通常在类定义上面使用关键字“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;
    ...
 <?php
namespace suites\plugins\content\agpaypal;
use \Codeception\Util\Fixtures;
use \Codeception\Verify;

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

    protected $tester;
    ...

您不能使用
使用
关键字导入类。您必须使用
include
/
require
语句。即使您使用一些php自动加载程序,自动加载程序仍然必须在内部使用
include
require

使用关键字的目的:

假设有两个同名的类;您会发现这很奇怪,但是当您使用大MVC结构时,就会发生这种情况。因此,如果您有两个同名的类,请将它们放在不同的名称空间中。现在考虑一下,当你的自动装入程序正在加载这两个类时(按<代码>要求< /COD>),并且你将使用类的对象。在这种情况下,编译器将弄不清楚在这两个类中加载哪个类对象。为了帮助编译器做出决定,您可以使用
use
语句,这样它就可以决定将在哪一个上使用

这里指的是这个

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

  • 作为类名别名-仅声明类的短名称(必须在类定义的外部声明) ()
  • 向类添加特征(必须在类定义的内部(顶部)声明为) ()
  • 在匿名函数定义中,在函数内部传递变量 ()

  • use
    基本上就是在文件中包含一个类来使用它。 在另一个文件中包含类文件有两种方法。 最通用的方法是
    require
    include
    方法。另一种方法是使用composer。假设这个目录结构

    Project
      |
      |--- Folder A
      |      |
      |      |---UserRegistration.php
      |
      |---Example
             |
             |--TestUserRegistration.php    
    
    文件夹A中有
    UserRegistration.php
    ,您希望在
    TestUserRegistration.php
    中使用
    UserRegistration.php
    中的代码,它可以是
    class
    trait
    接口

    方法1。

    testuserregistration.php
    中,您可以
    包括
    要求
    文件
    userregistration.php

    并使用它

    方法2

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

    include vendor/autoload.php;
    use FolderA\UserRegistration;
    
    哪一个更好,为什么?

    方法2使用composer是最好的方法。在方法1中,无论您想在何处包含UserRegistration,都必须找到UserRegistration文件的相对路径。所以让我们假设有一天你需要改变你的应用程序的目录结构,因为你提供的相对路径现在已经不存在了

    但是在方法2中,您总是使用您提供的名称空间\文件名,而不是要使用的位置。因此,即使更改目录结构,也不必获取所有代码并修改路径。它将一如既往地工作。
    要了解更多关于如何使用
    命名空间
    编写器

    的研究,非常感谢您的回答。我意识到,“使用”并不包括任何东西。它只是将指定的命名空间导入到当前范围。但如果是use\Codeception\Specify;它只在我将这一行放入类定义时起作用(如示例2所示)。如果我将该行放在上面(如示例1所示),则不会导入名称空间。我认为这是因为Specify是一种特性,没有类。但我不确定…谢谢,终于有道理了。在处理函数时,方法1实际上可能更好。例如,函数func_name(){include vendor/autoload.php;use FolderA\UserRegistration;}将失败。至少现在我知道如何解决这个问题了。这是错误的和误导性的<代码>使用
    仅定义类的别名。它不包含文件/类,也没有告诉autoloader这样做。鉴于这是一个关于使用的错误声明,所以根本不应该对其进行升级。谢谢AlexM的警告。