在laravel的不同上下文中使用“use”关键字的概念是什么?

时间:2017-11-30 07:27:40

标签: php laravel oop laravel-5 namespaces

我有两个关于在php(laravel)中使用“use”关键字的问题。

以下是laravel docs的代码摘录:

use App\Flight;

$flights = App\Flight::all();

foreach ($flights as $flight) {
    echo $flight->name;
}

第1行中的代码允许我们使用Flight模型,第2行有一个获取所有记录的语句。因此,在第2行中,我们不能只说Flight::all();而不是App\Flight::all();。两者都是正确的,它与相对和绝对路径的东西有关吗?

第二个查询(与softDeletes相关): 下面是我的一个模型的代码块:

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes;
    protected $dates = ['deleted_at'];
    protected $fillable = ['title','body'];
}

在第6行,使用以下语句:

use SoftDeletes;

为什么我们再次使用带有softDeletes的use关键字,因为我们没有将它与模型一起使用,只是我们可以这样做:

class Post extends Model

没有以下代码声明:

use Model;

如果是模特。

2 个答案:

答案 0 :(得分:3)

PHP中的use命令用于导入/别名命名空间(docs)。

首先,您需要知道此命令支持三种类型的导入/别名:类,接口和命名空间。

您的第一个示例是类导入:

use App\Flight;

$flights = Flight::all();

foreach ($flights as $flight) {
    echo $flight->name;
}

它基本上导入在命名空间Flight中找到的类App,因此我们假设该类将以这样的方式开始:

namespace App;

...

class Flight extends Model {...}

作为替代方法,您只需导入命名空间并使用它所属的命名空间引用该类:

use App;

$flights = App\Flight::all();

foreach ($flights as $flight) {
    echo $flight->name;
}

或者您可以避免导入任何内容并使用绝对引用:

$flights = \App\Flight::all();

foreach ($flights as $flight) {
    echo $flight->name;
}

在您的第二个示例中,SoftDeletes是一个trait,类似于一个类,但仅用于以一致的方式对功能进行分组(在这种情况下,执行软删除所需的所有方法) )。

这个特征看起来像这样:

namespace Illuminate\Database\Eloquent;

trait SoftDeletes{...}

正如您所看到的,它遵循与以前相同的逻辑:查看命名空间Illuminate\Database\Eloquent并使用class / trait SoftDeletes,以便我可以引用它。

希望这会对你有所帮助。

答案 1 :(得分:2)

1 - use用作导入App\Flight类。以下陈述都是正确的Flight::all()\App\Flight::all()(前面的\很重要,如果你离开前面的\,php将从当前命名空间中查找命名空间 - 相对)

2 - useTraits Manual的上下文中使用。 SoftDeletes是一个特质& Model是一个班级。