2016-06-22 7 views
0

ich nur eine Verwendung von Funktionen in Laravel bemerkt, dass ihre Argumente haben Namespace:PHP: Namespace Funktionsargumente

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; 
    } 

Ich konnte nicht überall Informationen finden, was diese sind oder was sie tun. Sollen sie Instanzen von Objekten in diesem bestimmten Namensraum sein? Wenn ja, wo instanziiere ich sie?

+0

Sie sind nicht namespaced, sie sind typhinted. – tkausl

+0

Wenn es sich um das Konstruktorargument handelt, ist es typisiert, dass es eine Instanz der Klasse Illuminate \ Contracts \ Mail \ Mailer sein muss. –

+0

Vielen Dank für die Erklärungen. Tyching kommt also nur in der Konstruktorfunktion vor, und in den anderen Funktionen ist es nur Namespacing? –

Antwort

1

Dies ist für den Abhängigkeitsinjektor. Kurz gesagt: Du erzählst Laravel was du brauchst und Laravel gibt es an dich weiter.

In PHP können Sie Parameter für alle Funktionen eingeben, nicht nur für den Konstruktor. In Ihrem Fall ist der Parameter für Ihren Konstruktor wie folgt typisiert: Illuminate\Contracts\Mail\Mailer, dh Sie dürfen nur eine Illuminate\Contracts\Mail\Mailer (oder eine Unterklasse) für diesen Parameter übergeben. Laravels Dependency-Injector verwendet nun diese Information, die er durch Reflektion erhält, um Ihnen zu geben, was Sie wollen, eine Illuminate\Contracts\Mail\Mailer. Sie können eine Vielzahl von Dingen tippen, sogar Ihre eigenen Klassen. Du könntest sogar einen Parameter für deine Controller-Funktion mit App\Jobs\PurchasePodcast eingeben und Laravel wird dir gerne einen erstellen und übergeben.

+0

Oder wenn es eine Schnittstelle eine Schnittstelle natürlich implementiert;) – dbf

1

Argumente, die Objekte aus dem Namespace sind, müssen Namespace sein, damit PHP weiß, welcher Objekttyp verwendet werden soll. In Ihrem Fall haben Sie keine Namespaced-Argumente zu __construct, nur Mailer, der sich auf Illuminate \ Contracts \ Mail \ Mailer bezieht. Sie können auch einen anderen Namen definieren, wenn Sie möchten: Illuminate \ Contracts \ Mail \ Mailer als myMailer verwenden;