Php (如何)我应该使用对象引用吗?

Php (如何)我应该使用对象引用吗?,php,performance,object,pass-by-reference,pass-by-value,Php,Performance,Object,Pass By Reference,Pass By Value,举个例子: 处理公司员工的应用程序库。员工详细信息存储在CSV文件中(请不要对此进行判断,因为这只是一个示例)。 处理员工信息的类是(代码非常简单,只是为了让您了解情况): 现在,应用程序中没有使用任何引用。所有对象变量都按值传递。我认为这可能会有一些开销。因此,一旦创建了所有Employee和Team对象,我就尝试将所有调用更改为引用,例如: $team1->managers[] = &$employee1; $employee0->managers[] = &$e

举个例子:

处理公司员工的应用程序库。员工详细信息存储在CSV文件中(请不要对此进行判断,因为这只是一个示例)。
处理员工信息的类是(代码非常简单,只是为了让您了解情况):

现在,应用程序中没有使用任何引用。所有对象变量都按值传递。我认为这可能会有一些开销。因此,一旦创建了所有Employee和Team对象,我就尝试将所有调用更改为引用,例如:

$team1->managers[] = &$employee1;
$employee0->managers[] = &$employee1;
但这瞬间增加了内存使用,这让我感到惊讶。我正在使用的示例只有200名员工,但我可以想象,当不得不与企业打交道时,这可能会增加到数千人甚至更多,内存使用量也会增加更多

当我想到这个例子时,我试着模仿ORM,在那里我可以做这样的事情:

$team->staff[n]->managers[n]->name; // infinite chaining?
理想情况下,“适当的”(初始?)对象将只存储在
Staff:$employees
Staff:$teams
中,因此
Staff:$teams\u names['Team Name']
将是对
Staff:$teams[n]
的引用。类似地,
Staff\u团队::$managers
将是对
员工::$employees
等的一系列引用。
但正如我提到的,一旦我开始使用引用,内存使用率就会上升

问题:
那么我该如何处理呢?
我应该使用pass-by-reference而不担心内存使用,还是应该使用pass-by-value?
在这种情况下,哪一个更好?为什么

注1:我(认为我)确实理解通过值传递对象和通过引用传递对象之间的区别。我只是问在这个例子中哪一个更好。

注意2:创建Staff\u Employee对象后,可能会对其进行一些操作。但可能非常小。

简短的回答:不要使用符号“按值传递”(这一点很容易混淆,在其他语言中被称为按引用传递)

较长的回答:我认为一些示例代码将是最具说明性的:

$a = new stdclass();
$b = $a;
$c = &$a;
$a->field = 'asdf';
echo '$b->field = ' . $b->field . "\n"; // $b->field = asdf
echo '$c->field = ' . $c->field . "\n"; // $c->field = asdf
因此,如果您只是将其指定给对象的字段,则没有区别。只有在覆盖变量本身时,符号和才会起作用


但是,一般来说,这种行为是不好的jujuju(并且只有当您试图从一个函数返回多个值时才有用;您也可以使用
list()
for。)

Hmm,我尝试复制您所拥有的,并且没有注意到内存使用的任何增加,无论对象如何添加到数组中。。。默认情况下,PHP5实际上通过引用传递对象,所以在这种情况下“&”不应该做很多事情。
$a = new stdclass();
$b = $a;
$c = &$a;
$a->field = 'asdf';
echo '$b->field = ' . $b->field . "\n"; // $b->field = asdf
echo '$c->field = ' . $c->field . "\n"; // $c->field = asdf
$a = new stdclass();
$b = $a;
$c = &$a;
$a = 2;
echo 'is_object($b) = ' . is_object($b) . "\n"; // is_object($b) = 1
echo 'is_object($c) = ' . is_object($c) . "\n"; // is_object($c) = 0