У меня есть метод, который берет ссылку
// CarService.php
public function getCars(&$carCollection = null)
{
$promise = // guzzle request for getting all cars would be here
$promise->then(function (ResponseInterface $response) use (&$carCollection) {
$cars= json_decode($response->getBody(), true);
$carCollection= new CarCollection($cars);
});
}
Однако при доступе к коллекции и попытке ее использования я получаю сообщение об ошибке
Argument 1 passed to {placeholder} must be an instance of {placeholder}, null given
Я знаю, что причина этого в том, что конструктор ничего не возвращает, но как я все еще могу присвоить свою переменную новому экземпляру CarCollection
(который расширяет Доктрину ArrayCollection
)
Я даже попробовал это статическим методом, как обойти
// CarCollection.php
public static function create(array $cars): CarCollection
{
$carCollection = new CarCollection($cars);
return $carCollection;
}
// CarService.php
public function getCars(&$carCollection = null)
{
$cars = // curl request for getting all cars would be here
$carCollection = CarCollection::create($cars)
}
но все равно ноль. Это почему? Как я могу установить ссылочную переменную для нового класса?
Я получаю доступ к этому методу
$carService = $this->get('tzfrs.vehicle.services.car');
$carCollection = null;
$promises = [
$carService->getCars($carCollection)
];
\GuzzleHttp\Promise\unwrap($promises);
var_dump($carCollection); // null
Когда я устанавливаю ссылку непосредственно, например.
// CarService.php
public function getCars(&$carCollection = null)
{
$carCollection = new CarCollection([]);
}
это работает без проблем. Похоже, обратный вызов как-то проблема.
Кто бы это ни отрицал, не могли бы вы уточнить, почему и почему вы проголосовали за закрытие?
Я мог бы неправильно понять вопрос, но вы должны иметь возможность изменять объект при передаче по ссылке. Смотрите здесь для примера: https://3v4l.org/KtFvZ
В последнем примере кода, который вы добавили, вы не должны передавать $carCollection
по ссылке, &
должен присутствовать только в определении метода / функции, а не при его вызове. Я не думаю, что это ваша проблема, это должно быть ошибка в php7.
Других решений пока нет …