Php 什么时候应该将对象作为参数传递,而不是实例化?

Php 什么时候应该将对象作为参数传递,而不是实例化?,php,instantiation,Php,Instantiation,我很好奇将对象实例作为参数传递给同一类中的另一个函数与在新函数中创建该对象的另一个实例相关的最佳实践和任何性能或其他考虑因素。下面是一个简单的例子: 选项1:将培训生和培训生控制器实例传递给其他功能 protected function startTraining($traineeID) { $traineeController = new TraineeController(); $trainee = $traineeController->findTrainee($tr

我很好奇将对象实例作为参数传递给同一类中的另一个函数与在新函数中创建该对象的另一个实例相关的最佳实践和任何性能或其他考虑因素。下面是一个简单的例子:

选项1:将培训生和培训生控制器实例传递给其他功能

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:仅通过$trainee,每次实例化一个新的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);
}
在上面的例子中,我每次都需要在所有函数中传递
$traineee
,而不是从
$traineeeid
创建一个新的学员,因为在“培训”过程中,其他一些东西会在后台进行,否则在相关数据保存到数据库之前就会丢失。然而,这不是TraineeController所必需的-我可以将其作为参数传递,也可以根据需要实例化一个新的TraineeController。哪个是更好的选择


我看到,公认的答案是传递整个对象通常更有效,而实例化另一个对象则更有效,因为您是通过引用传递的。这对PHP适用吗?Ie是使用
&

通过引用将整个对象传递给所需函数的最有效方法。将对象作为引用传递没有什么错,但请注意,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().

谢谢,这很有帮助。我的控制器没有自己的持久属性(它们基本上只是到其他对象的网关),所以我想我将尝试通过引用传递它们。如果出现这种情况,您是否有关于按值传递与创建性能方面的新实例的输入?我在这里找到了一些基准测试(不是官方的):。当通过引用传递控制器时,不要期望性能有巨大的提高。这要视情况而定。如果在控制器的构造中执行耗时的代码,或者在对象实例化上循环了大量次,那么使用引用可能会产生明显的差异。我想说的是:通过引用传递并不是性能调优的神奇解决方案。这在某些情况下很方便。