PHP:Namespaced函数参数

时间:2016-06-22 10:02:46

标签: php oop namespaces

我在Laravel中注意到了一些使用其参数为namespaced的函数:

namespace App\Jobs;

use App\User;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Contracts\Bus\SelfHandling;

class PurchasePodcast implements SelfHandling
{

    protected $mailer;

    public function __construct(Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

我无法找到有关这些内容或内容的任何信息。它们应该是该特定命名空间中对象的实例吗?如果是这样,我在哪里实例化它们?

2 个答案:

答案 0 :(得分:1)

作为命名空间对象的参数必须是命名空间,因此PHP将知道要使用的Object类型。 在你的情况下,你没有__construct的命名空间参数,只有Mailer引用了Illuminate \ Contracts \ Mail \ Mailer。如果您愿意,还可以定义其他名称: 使用Illuminate \ Contracts \ Mail \ Mailer作为myMailer;

答案 1 :(得分:1)

这是针对依赖注入器的。简而言之:你告诉Laravel你需要什么,Laravel将它传递给你。

在PHP中,您可以为所有函数键入提示参数,而不仅仅是构造函数。在您的情况下,构造函数的参数被键入为Illuminate\Contracts\Mail\Mailer,这意味着,您只能为此参数传递Illuminate\Contracts\Mail\Mailer(或子类)。 Laravels Dependency-Injector现在将使用这些信息通过反射得到你想要的东西,Illuminate\Contracts\Mail\Mailer。您可以输入各种各样的内容,甚至是您自己的类。您甚至可以使用App\Jobs\PurchasePodcast为控制器函数键入提示参数,Laravel将很乐意为您创建并传递一个参数。