我在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;
}
我无法找到有关这些内容或内容的任何信息。它们应该是该特定命名空间中对象的实例吗?如果是这样,我在哪里实例化它们?
答案 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将很乐意为您创建并传递一个参数。