使用PHP类内外的use语句导入特征



为什么我们要使用use语句在类外导入特征,然后在类内再次使用它??!

示例(在Laravel用户模型中(:

use IlluminateDatabaseEloquentSoftDeletes;

class User extends Authenticatable
{
use SoftDeletes;
.
.
.
.
.
}

为什么特征的处理方式与其他类不同,在其他类中,我们只在类外导入一次名称空间,就可以直接使用它?!

use关键字在每个上下文中都有不同的含义。

  • 在类内部确定类使用的特性请参阅
  • 在闭包中,use用于确定要在作用域内导入的变量请参阅
  • 其中,use导入一个类的名称空间来映射一个类名,也可以用useas的组合设置一个别名参见

使用类外来包含使用命名空间的实际类。因此,它只是被包括在内,但还没有在该类中使用。

如果你真的需要在类中使用该类,那么你需要在类内使用它。

您可以通过以下方式省略类外的使用。

使用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中有三种用法,它们都有不同的含义。

  1. use AppModelsProduct;
    

    意思是:当我在下面的类别中键入产品时,请使用此完全限定名称。

  2. class User
    {
    use SoftDeletes;
    

    意味着:在这个类中加载TraitSoftDeletes(注入一些函数(。

  3. collect([])->map(function ($id) use ($product) {
    // function body
    });
    

    意味着:在有自己作用域的新匿名函数中使用变量$product。没有它,您就无法访问函数体中的$product变量。

最新更新