laravel 队列dispatch传参到Job类里的handle()方法里数据为什么会改变
时间: 2023-10-10 15:11:05 浏览: 51
在 Laravel 中,当你将一个 Job 推送到队列里面时,你可以通过 dispatch 函数将数据传递给 Job 类的构造函数。在 Job 类的构造函数中,你可以将这些数据保存到类的属性中,然后在 handle 函数中使用它们。
然而,有时候你可能会在 Job 类的构造函数中对传递进来的数据进行修改,这将会影响到后续 handle 函数中对这些数据的访问。这是因为在 PHP 中,对象和数组都是以引用的方式传递的,也就是说,当你对传递进来的对象或数组进行修改时,实际上是修改了同一个对象或数组,而不是一个拷贝。
举个例子,假设你有一个 Job 类,在构造函数中接收一个数组参数,并将它保存到类的属性中:
```php
class MyJob implements ShouldQueue {
protected $data;
public function __construct(array $data) {
$this->data = $data;
}
public function handle() {
// 使用 $this->data
}
}
```
然后你使用 dispatch 函数将这个 Job 推送到队列中:
```php
$data = ['foo' => 'bar'];
MyJob::dispatch($data);
```
在这种情况下,如果在构造函数中修改了 $data 数组,那么在 handle 函数中访问 $this->data 时,你会发现它已经被修改了。这是因为在 PHP 中,数组是以引用的方式传递的,所以当你在构造函数中修改 $data 数组时,实际上是修改了同一个数组,而这个数组也被保存在了 $this->data 属性中。
为了避免这个问题,你可以在构造函数中对传递进来的数据进行拷贝,这样就不会影响到后续的处理:
```php
class MyJob implements ShouldQueue {
protected $data;
public function __construct(array $data) {
$this->data = $data;
// 对 $data 数组进行拷贝
$this->data = unserialize(serialize($data));
}
public function handle() {
// 使用 $this->data
}
}
```
在这个例子中,我们使用 serialize 和 unserialize 函数对 $data 数组进行了深拷贝,这样就不会影响到后续的处理。