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

s.w*_*dit 2 php parameters function

假设我们有一些对象

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

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

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

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

some($a);
Run Code Online (Sandbox Code Playgroud)

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

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

some($a->b, $a->d[1]);
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*tar 8

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

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

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


Mih*_*rga 5

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

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

some($a);
Run Code Online (Sandbox Code Playgroud)

因为随着时间的推移,您将需要该对象/数组的其他部分,您将不得不修改函数和您创建它们的调用.因此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]);
    }
}
Run Code Online (Sandbox Code Playgroud)