[英]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 param
是string
那么它将尝试从container
获取实例,否则它将从$job param
中获取实例
$job = is_string($job) ? Container::getInstance()->make($job) : $job;
检查你可以dd
dd(new SendJoinerReminderEmails)
或者
dd(SendLeaverReminderEmails::class)
不, Class instance与Class name 不同。
new SomeClass()
将在 class 上返回一个实例或 object。SomeClass::class
将返回 SomeClass 的完全限定名称但在这种情况下,两者都应该起作用,因为方法job()
接受任何class name
或instance
。
如果您传递 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.