我应该如何以及在何处使用关键字;使用「;在php中
我通常在类定义上面使用关键字“use”。像这样:我应该如何以及在何处使用关键字;使用「;在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; ... <
<?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的警告。