【问题标题】:PHP: Namespaced function argumentsPHP:命名空间函数参数
【发布时间】:2016-06-22 10:02:46
【问题描述】:

我刚刚注意到在 Laravel 中使用了将参数命名为命名空间的函数:

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

我找不到任何关于这些是什么或它们做什么的信息。它们是否应该是该特定命名空间中的对象实例?如果是这样,我在哪里实例化它们?

【问题讨论】:

  • 它们没有命名空间,它们是类型提示的。
  • 如果我们谈论的是构造函数参数,它的类型提示必须是类Illuminate\Contracts\Mail\Mailer的实例。
  • 非常感谢您的解释。那么,类型提示只发生在构造函数中,而在其他函数中它只是命名空间?

标签: php oop namespaces


【解决方案1】:

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

在 PHP 中,您可以对所有函数进行类型提示参数,而不仅仅是构造函数。在您的情况下,构造函数的参数类型提示为Illuminate\Contracts\Mail\Mailer,这意味着您只能为此参数传递Illuminate\Contracts\Mail\Mailer(或子类)。 Laravel Dependency-Injector 现在将使用这些通过反射获得的信息来给你想要的东西,Illuminate\Contracts\Mail\Mailer。你可以输入很多东西,甚至是你自己的类。你甚至可以使用 App\Jobs\PurchasePodcast 为你的控制器函数键入一个参数,Laravel 会很高兴地创建一个参数并将其传递给你。

【讨论】:

  • 或者如果它实现了一个接口当然是一个接口;)
【解决方案2】:

来自命名空间的对象的参数必须被命名空间,以便 PHP 知道使用什么对象类型。 在您的情况下,您没有 __construct 的命名空间参数,只有 Mailer 引用 Illuminate\Contracts\Mail\Mailer。如果您愿意,还可以定义其他名称: 使用 Illuminate\Contracts\Mail\Mailer 作为 myMailer;

【讨论】:

    猜你喜欢
    • 2015-11-05
    • 2018-09-14
    • 2020-04-23
    • 2017-05-10
    • 2012-11-07
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多