2

假设我们有一些对象

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

此外,我们还有一个函数可以对对象的某些属性(例如band d[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对象还是数组。

4

3 回答 3

8

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

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

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

于 2012-05-06T06:30:50.840 回答
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]);
    }
}
于 2012-05-06T06:21:15.003 回答
3

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

  function find_median($low, $high) {

     return ($low + $high)/2;

  }

我们的对象称为 UserStats,包含该用户在各个区域的多个统计数据数组。传入整个对象(甚至只是特定统计组的整个数组)不会犯罪或杀死小狗,但我认为它会很懒惰,最终导致一个简单的函数变成一个臃肿的计算器,因为“好吧,它已经有了所有的数据,还不如在这里做呢!”

所有这些都是我对编码的看法,即它应该尽可能优雅、简单和巧妙地反映实际的模型和工作流程。我会努力使这与效率和性能相结合,但归根结底,我想要的是讲述故事、绘制地图、显示实际情况的代码,而不是围绕对象和数组的代码,而不是得到它需要的东西。

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

于 2012-05-06T06:40:12.983 回答