传递/返回值的最佳方法

问题描述:

我问这个问题的原因是因为我大约两个月前登陆了我的第一个真实(是的,付费办公室工作 - 没有更多的志愿者!)Web开发工作。我在计算机信息系统(网络开发和编程)方面有几个同事。但是,你们许多人都知道,你在大学学到的东西以及你在工作现场需要的东西可能会有很大的不同,甚至更多。我肯定从我的工作中学习 - 我重新创建了我们在MVC体系结构中从头开始使用的整个框架 - 第一次做与设计模式有关的任何事情。传递/返回值的最佳方法

我在想你会推荐什么样的方式来传递/返回OO PHP中的值?目前我还没有实现任何标准,但是我希望在框架的规模增加之前创建一个标准。当超过1个值需要返回时,我返回数组,有时传递数组或有多个参数。数组是最好的方式,还是有更有效的方法,比如json?我喜欢数组中的想法来传递更多或更少的值,只需要更改数组而不是函数定义本身。

谢谢大家,只是想成为一个更好的开发者。

编辑:我很抱歉,我以为我已经接受了这个问题的答案。我的坏,非常非常糟糕。

+2

稍微偏离主题。但除非有一些主要的需求来编写自己的框架,为什么不使用现有的社区支持呢?大部分思路已经为你完成 – Mark 2009-08-07 22:12:56

+0

工作要求 - 我们不希望太依赖于其他方面的代码 - 特别是我们所做的每个项目的主要成分。有些事情发生在那些伟大的框架和噗噗之一,我们上了一条小溪。我喜欢他们,不会介意使用Code Igniter,而是老板的决定和前面提到的风险。 – 2009-08-07 22:26:47

您经常遇到实际需要多个返回值的情况?我无法想象它经常发生。

我并不是说你要返回的东西是预期的是一种可枚举的数据集合(即查询结果),但返回的数组没有其他含义持有两个或更多的值。

PHP库本身使用的一种技术是参考参数,例如preg_match()。该函数本身返回一个布尔值,但可以使用提供的第三个参数来存储匹配的数据。这本质上是“第二个回报价值”。

绝对不要使用像JSON这样的数据交换格式。这些格式的目的是以预期的,可分析的方式在不同系统之间移动数据。在单个PHP执行中,你不需要这个。

+0

与参考参数很好的想法,我从来没有想到这一点。你会推荐什么参数?在需要的地方使用多个参数或单个参数和数组的组合? (例如一个选项参数 - 一个包含n个长度选项的数组) – 2009-08-07 22:31:24

您可以返回任何您想要的:单个值,数组或参考(取决于功能需求)。只要一致。

但请不要在内部使用JSON。它只会产生不必要的开销。

我也使用数组来返回多个值,但实际上它并不经常发生。如果是这样,它通常是一个合理的数据分组,例如从getCoordinates()函数返回array('x'=>10,'y'=>10)。如果你发现自己做了很多处理,并从很多函数中返回数组中的数据,那么可能会进行一些重构来将工作放到更小的单元中。

话虽这么说,你所提到的:

我喜欢在阵列的想法传递更多的价值或更少,你只需要改变数组,而不是函数定义本身。

在这方面,您可能会感兴趣的另一种技术是使用具有可变数量参数的函数。这是完全可以接受的声明函数不带参数:

function stuff() { 
    //do some stuff 
} 

但所有的参数调用它,你在乎给它:

$x = stuff($var1, $var2, $var3, $var4); 

通过使用func_get_args()func_get_arg()(单数)和func_num_args()你可以很容易地找到/循环传递的所有参数。这个作品非常好,如果你没有具体的参数考虑,例如说一个sum()功能:

function sum() 
{ 
    $out = 0; 
    for($i = 0; $i < $c = func_num_args(); $i++) { 
     $out += func_get_arg($i); 
    } 
    return $out; 
} 

//echoes 35 
echo sum(10,10,15); 

回味无穷,也许你会发现它是有用的。

我小心避免传递/返回数组,其中的键有“特殊”的含义。例如:

<?php 
// Bad. Don't pass around arrays with 'special' keys 
$personArray = array("eyeColor"=>"blue", "height"=>198, "weight"=>103, ...); 

?> 

使用像这样的数组的代码很难重构和调试。这种类型的结构可以更好地表现为一个对象。

<?php 

Interface Person { 
    /** 
    * @return string Color Name 
    */ 
    public function getEyeColor(); 
    ... 
} 
?> 

该接口提供合同一个该消耗代码可以依赖。

除此之外,我想不出任何理由来限制自己。


注意:要清楚的是,关联数组对于列表数据非常有用。如:

<?php 
// Good array 
$usStates = array("AL"=>"ALABAMA", "AK"="ALASKA", ...); 
?>