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


Should I pass whole object as function parameter?

>假设我们有一些对象

$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

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

如果仅按值传递某些属性(如示例中所示(,如果需要更改对象属性,则必须返回某些内容,然后将其从外部应用于对象。当然,您始终可以将属性本身作为引用传递。

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

我相信

第一种选择是要走的路。

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]);
    }
}

我倾向于同意 Mihai 的观点,因为通常我们低估了对象属性和函数的有用性,但如果我们真的想要优雅的代码,函数参数应该反映函数目的(和整体数据模型(。 话虽如此,使函数成为对象本身的方法是一个很好的论据,但假设它是一个实用程序函数:

  function find_median($low, $high) {
     return ($low + $high)/2;
  }

我们的对象称为UserStats,在各个区域保存该用户统计信息的多个数组。 传入整个对象(甚至只是特定统计组的整个数组(不会是犯罪或杀死小狗,但我认为它会很懒惰,最终导致一个简单的函数变成一个臃肿的计算器,因为"哎呀,它已经拥有所有数据,不妨在这里完成所有操作!

所有这些都是我对编码的看法,即它应该尽可能优雅、简单和巧妙地反映实际的模型和工作流程。我会努力提高效率和性能,但归根结底,我想要的是讲述故事、绘制地图、显示真实情况的代码,而不是将对象和数组四处游荡而不是获取所需内容的代码。

了这么多,也许你确实想要一个计算器等,就像 Mihal 说的,需要一个值而不是拥有它比只拥有你需要的数据要常见得多,不多不少。