繁体   English   中英

新的 ClassName 是否与 ClassName::class - PHP 相同

[英]Is new ClassName the same as ClassName::class - PHP

在我的 Laravel 应用程序中,我在 Kernal.php 中看到了这两行


$schedule->job(new SendJoinerReminderEmails)->dailyAt('09:00');
$schedule->job(SendLeaverReminderEmails::class)->dailyAt('09:00');

这些在功能上是否相同,一个比另一个更正确?

new SendJoinerReminderEmails返回 class 实例

SendLeaverReminderEmails::class class 返回string的路径,如App\Mails\SendLeaverReminderEmails

如果你看到job方法

public function job($job, $queue = null, $connection = null)
{
        return $this->call(function () use ($job, $queue, $connection) {
            $job = is_string($job) ? Container::getInstance()->make($job) : $job;

            if ($job instanceof ShouldQueue) {
                $this->dispatchToQueue($job, $queue ?? $job->queue, $connection ?? $job->connection);
            } else {
                $this->dispatchNow($job);
            }
        })->name(is_string($job) ? $job : get_class($job));
    }

这里如果$job paramstring那么它将尝试从container获取实例,否则它将从$job param中获取实例

 $job = is_string($job) ? Container::getInstance()->make($job) : $job;

检查你可以dd

dd(new SendJoinerReminderEmails)

或者

dd(SendLeaverReminderEmails::class)

不, Class instanceClass name 不同

  • new SomeClass()将在 class 上返回一个实例或 object。
  • 另一方面, SomeClass::class将返回 SomeClass 的完全限定名称

但在这种情况下,两者都应该起作用,因为方法job()接受任何class nameinstance

如果您传递 class 名称,它将解析方法内的实例,如下所示 -

$job = is_string($job) ? resolve($job) : $job;

请参阅下面的job方法的完整实现 -

/**
 * Add a new job callback event to the schedule.
 *
 * @param  object|string  $job
 * @param  string|null  $queue
 * @param  string|null  $connection
 * @return \Illuminate\Console\Scheduling\CallbackEvent
 */
public function job($job, $queue = null, $connection = null)
{
    return $this->call(function () use ($job, $queue, $connection) {
        $job = is_string($job) ? resolve($job) : $job;

        if ($job instanceof ShouldQueue) {
            dispatch($job)
                ->onConnection($connection ?? $job->connection)
                ->onQueue($queue ?? $job->queue);
        } else {
            dispatch_now($job);
        }
    })->name(is_string($job) ? $job : get_class($job));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM