Мне любопытно узнать о передовых практиках и любых соображениях производительности или других соображениях, касающихся передачи экземпляра объекта в качестве параметра другой функции в том же классе, по сравнению с созданием другого экземпляра этого объекта в новой функции. Вот быстрый пример:
Вариант 1: передать оба экземпляра Trainee И TraineeController другим функциям
protected function startTraining($traineeID) {
$traineeController = new TraineeController();
$trainee = $traineeController->findTrainee($traineeID);
$this->initializeTraining($trainee, $traineeController);
$this->doSomeOtherStuffWithTrainee($trainee, $traineeController);
return Redirect::back()->with('trainee', $trainee);
}
protected function initializeTraining($trainee, $traineeController) {
$trainee->blah1 = 'red';
$trainee->blah2 = 'blue';
$propertiesToUpdate = [
'blah1' => $trainee->blah1,
'blah2' => $trainee->blah2
];
$traineeController->updateTrainee($trainee->traineeID, $propertiesToUpdate);
}
Вариант 2: передать ТОЛЬКО $ стажеру, каждый раз создавать новый экземпляр TaineeController
protected function startTraining($traineeID) {
$traineeController = new TraineeController();
$trainee = $traineeController->findTrainee($traineeID);
$this->initializeTraining($trainee);
$this->doSomeOtherStuffWithTrainee($trainee);
return Redirect::back()->with('trainee', $trainee);
}
protected function initializeTraining($trainee) {
$trainee->blah1 = 'red';
$trainee->blah2 = 'blue';
$propertiesToUpdate = [
'blah1' => $trainee->blah1,
'blah2' => $trainee->blah2
];
$traineeController = new TraineeController();
$traineeController->updateTrainee($trainee->traineeID, $propertiesToUpdate);
}
В вышеупомянутом мне нужно пройти $trainee
по всем функциям каждый раз вместо создания нового стажера из $traineeID
потому что некоторые другие вещи происходят за кулисами во время процесса «обучения», которые в противном случае были бы потеряны до сохранения соответствующих данных в БД. Однако это не требуется для TraineeController — я могу либо передать его в качестве параметра, либо создать новый TraineeController столько, сколько захочу. Какой лучший выбор?
Я видел этот вопрос, касающийся C #, где принятый ответ состоял в том, что передача всего объекта, как правило, более эффективна, а создание экземпляра другого объекта — передача по ссылке. Это верно для PHP? Т.е. это наиболее эффективный подход для передачи всего объекта по ссылке на требуемые функции с использованием &
?
Нет ничего плохого в передаче объекта в качестве ссылки, но обратите внимание, что php ожидает, что ваш аргумент функции должен ожидать ссылку, а не просто передавать переменную по ссылке (PHP документы). php 5.4.0 даже вызовет фатальную ошибку, если это не соблюдается:
право:
protected function initializeTraining($trainee, &$traineeController) {}
$this->initializeTraining($trainee, $traineeController);
неправильно:
protected function initializeTraining($trainee, $traineeController) {}
$this->initializeTraining($trainee, &$traineeController);
Передача объектов по ссылке в большинстве случаев будет иметь лучшую производительность, чем повторная инициация объекта, но передача по ссылке может стать сложной, если у вашего объекта есть свои свойства:
class TraineeController {
$fooCalled = false;
function foo(){ $this->fooCalled = true; }
function isFooCalled(){ return $this->fooCalled; }
}
$traineeController = new TraineeController();
$traineeController->foo();
//&$traineeController->isFooCalled() will be different from
//new TraineeController()->isFooCalled().
Других решений пока нет …