我应该将整个对象作为函数参数传递吗?

时间:2012-05-06 06:14:09

标签: php function parameters

假设我们有一些对象

$a = new stdClass;
$a->b = 7;
$a->c = 'o';
$a->d = array(1,2,3);

此外,我们还有一个函数可以使用对象的某些属性(例如bd[1])。

我的问题:我的函数应该接受整个对象作为参数,如:

function some($a) {
 var_dump($a->b);
 var_dump($a->d[1]);
}

some($a);

或仅接受某些字段,例如:

function some($b, $d) {
 var_dump($b);
 var_dump($d);
}

some($a->b, $a->d[1]);

实际上无论是$a对象还是数组。

3 个答案:

答案 0 :(得分:8)

请记住,默认情况下对象是通过引用传递的,因此如果传递整个对象,则可以根据需要在函数内部更改对象值。

如果只按值传递某些属性,就像在您的示例中一样,如果需要更改对象属性,则必须返回一些内容,然后从外部将其应用于对象。当然,您总是可以将属性本身作为引用传递。

无论如何,我会使用第一种方法(传递整个对象),因为它更具可读性,并且如果您以后需要添加属性则更具可扩展性。内存影响很小,因为只复制了指向对象的指针,而不是您需要的每个属性的值。

答案 1 :(得分:5)

我相信第一个选择是要走的路。

function some($a) {
 var_dump($a->b);
 var_dump($a->d[1]);
}

some($a);

因为随着时间的推移,您可能需要该对象/数组的其他部分,您必须修改函数和调用它们的位置。 所以function some()可以是一个全局函数,并以其他方式使用,你可以添加后面的语句,修改函数而不必在任何地方修改。

function some($a, $param1 = 1){
    if($param1 == 1){
        var_dump($a->c);
        var_dump($a->d[2]);
    } else {
        var_dump($a->b);
        var_dump($a->d[1]);
    }
}

答案 2 :(得分:3)

我倾向于同意Mihai,因为通常我们低估了对象属性和函数的用处,但如果我们真的想要优雅的代码,那么函数参数应该反映功能目的(以及整体数据模型) 。话虽如此,将函数作为对象本身的方法是一个很好的论据,但假设它是一个效用函数:

  function find_median($low, $high) {

     return ($low + $high)/2;

  }

我们的对象叫做UserStats,在各个区域保存该用户统计数据的几个数组。传递整个对象(甚至只是特定统计组的整个数组)都不会是犯罪或杀死小狗,但我认为它会变得懒惰,并最终导致一个简单的函数变成一个膨胀的计算器,因为“好吧,它已经有了所有的数据,也可以在这里完成所有这些!”

所有这些都是我对编码的看法,即它应该尽可能优雅,简单,巧妙地反映实际的模型和工作流程。我将尝试使这与效率和性能相遇,但在一天结束时,我希望代码能够讲述一个故事,绘制一个地图,显示真正发生的事情,而不是代码中的对象和数组,而不是得到它需要的东西。

说完所有这些之后,也许你确实需要一个计算器等,就像Mihal所说的那样,需要一个值而不是拥有它比获得你需要的数据更常见,不多也不少