Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我应该将整个对象作为函数参数传递吗?_Php_Function_Parameters - Fatal编程技术网

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

Php 我应该将整个对象作为函数参数传递吗?,php,function,parameters,Php,Function,Parameters,假设我们有目标 $a = new stdClass; $a->b = 7; $a->c = 'o'; $a->d = array(1,2,3); 此外,我们还有一个函数,它可以处理对象的某些属性(例如b和d[1]) 我的问题:我的函数是否应该接受整个对象作为参数,如: function some($a) { var_dump($a->b); var_dump($a->d[1]); } some($a); 或者只接受其处理过程类似的某些字段: functio

假设我们有目标

$a = new stdClass;
$a->b = 7;
$a->c = 'o';
$a->d = array(1,2,3);
此外,我们还有一个函数,它可以处理对象的某些属性(例如
b
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
对象还是数组。

我相信第一种选择是可行的

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,它在不同的区域中保存该用户的统计数据的多个数组。传入整个对象(甚至只是特定统计组的整个数组)不会是犯罪或杀死小狗,但我认为这会是懒惰的,最终导致一个简单的函数变成一个臃肿的计算器,因为“好吧,见鬼,它已经有了所有的数据,也可以在这里全部完成!”

所有这些都是我对编码的看法,即它应该尽可能优雅、简单和巧妙地反映实际的模型和工作流。我将努力使这一点符合效率和性能,但归根结底,我希望代码能够讲述一个故事,绘制一张地图,显示实际情况,而不是将对象和数组四处lob,而不是获取所需的内容


说了这么多,也许你真的想要一台计算器,等等,就像Mihal说的,需要一个值而没有它比只需要你需要的数据要普遍得多,不多也不少。

在您的情况下,哪种方式使代码读起来最好?这种问题在这里是离题的,因为您已经看到没有“一个明确的答案”。请阅读。这两种方式都不限制功能,因此我会针对常见情况进行设计(可能调用代码通常已经构造了对象,或者它们没有)@Cory Carson代码如何读取并不重要。我担心它的价值,或者不把不必要的东西传递给功能。可能需要PHP提供更多的资源来处理它。@webbandit对象是通过引用传递的,所以你不是在“传递不必要的东西”,你只是在传递指向对象的指针的副本。是的,这可能是最好的解释。正如我期望听到的那样。谢谢。但是现在你的函数需要知道对象是如何构造的。如果要将其用于其他对象,该怎么办?它还需要了解它们是如何构造的。最好是实现一个接口。我认为如果我想把另一个对象传递给这个函数,这个对象应该具有相同的结构,这样函数就只能处理特定结构的对象。