为什么我们要使用use
语句在类外导入特征,然后在类内再次使用它??!
示例(在Laravel用户模型中(:
use IlluminateDatabaseEloquentSoftDeletes;
class User extends Authenticatable
{
use SoftDeletes;
.
.
.
.
.
}
为什么特征的处理方式与其他类不同,在其他类中,我们只在类外导入一次名称空间,就可以直接使用它?!
use
关键字在每个上下文中都有不同的含义。
- 在类内部确定类使用的特性请参阅
- 在闭包中,
use
用于确定要在作用域内导入的变量请参阅 - 其中,
use
导入一个类的名称空间来映射一个类名,也可以用use
和as
的组合设置一个别名参见
使用类外来包含使用命名空间的实际类。因此,它只是被包括在内,但还没有在该类中使用。
如果你真的需要在类中使用该类,那么你需要在类内使用它。
您可以通过以下方式省略类外的使用。
使用Illuminate\Database\Eloquent\SoftDeletes;
直接在类内部。
因为第一个use
指示要使用的类已经是自动加载器所需的。这有助于防止具有相同名称的类发生冲突。
例如
// same name but avoid collision by an alias
use AppModelsRequest as RequestModel;
use Request;
第二个用法绑定到Trait
,并指示它应该在这个类中使用。您可以(糟糕的做法(在一个文件中定义多个类,这就是为什么您需要表明您希望在该特定类上使用Trait。
class A {
use SomeTrait;
}
class B {
/// not using Trait
}
edit:也许很高兴知道use
关键字在PHP中有三种用法,它们都有不同的含义。
use AppModelsProduct;
意思是:当我在下面的类别中键入产品时,请使用此完全限定名称。
class User { use SoftDeletes;
意味着:在这个类中加载
Trait
SoftDeletes(注入一些函数(。collect([])->map(function ($id) use ($product) { // function body });
意味着:在有自己作用域的新匿名函数中使用变量
$product
。没有它,您就无法访问函数体中的$product
变量。