在工作中大量重构的过程中,我希望引入stdClass*****作为从函数返回数据的方法,并且我试图找到支持我的决定的非主观参数.
是否有任何情况何时最好使用一个而不是另一个?
使用stdClass而不是数组会有什么好处?
有些人会说函数必须尽可能少且具体,才能返回单个值.我决定使用stdClass是暂时的,因为我希望从长远来看为每个进程找到正确的Value Objects.
Pek*_*ica 60
通常的做法是
返回具有固定分支的已定义数据结构时使用对象:
$person
-> name = "John"
-> surname = "Miller"
-> address = "123 Fake St"
Run Code Online (Sandbox Code Playgroud)返回列表时使用数组:
"John Miller"
"Peter Miller"
"Josh Swanson"
"Harry Miller"
Run Code Online (Sandbox Code Playgroud)返回结构化信息列表时使用对象数组:
$person[0]
-> name = "John"
-> surname = "Miller"
-> address = "123 Fake St"
$person[1]
-> name = "Peter"
-> surname = "Miller"
-> address = "345 High St"
Run Code Online (Sandbox Code Playgroud)对象不适合保存数据列表,因为您始终需要一个键来解决它们.数组可以实现两种功能 - 保持任意列表和数据结构.
因此,如果需要,可以在第一个和第三个示例的对象上使用关联数组.我会说这只是一个风格和偏好的问题.
@Deceze在何时使用对象(验证,类型检查和未来方法)方面提出了许多好处.
dec*_*eze 42
使用stdClass来完成与数组相同的功能对恕我直言并不是很有用,它只是增加了对象的开销而没有任何实际的好处.你也错过了许多有用的数组函数(例如array_intersect).您至少应该创建自己的类来启用类型检查,或者向对象添加方法以使其值得使用对象.
Gor*_*don 18
我不认为在数组上使用stdClass有任何合理的优势,只要您的唯一目的是从函数调用返回多个任意数据类型.
由于技术上无法在本机返回多个值,因此必须使用可容纳PHP中所有其他数据类型的容器.那将是一个对象或一个数组.
function fn1() { return array(1,2); }
function fn2() { return array('one' => 1, 'two' => 2); }
function fn3() { return (object) array(1,2); }
function fn4() { return (object) array('one' => 1, 'two' => 2); }
Run Code Online (Sandbox Code Playgroud)
所有这些都可行.该阵列的速度可以忽略不计,而且输入的工作量也较少.与通用的stdClass相比,它也有一个明确定义的目的(有点白痴,不是这样).两者都只有一个隐式接口,因此您必须查看文档或函数体以了解它们将包含的内容.
如果你想不惜任何代价使用对象,你可以使用ArrayObject或SplFixedArray,但是如果你看看他们的API你会说你需要他们的功能来完成返回随机多个值的简单任务吗?我不这么认为.不要误解我的意思:如果你想使用stdClass,那就用它吧.它不会破坏任何东西.但你也不会得到任何东西.要添加至少一些好处,您可以为此创建一个名为ReturnValues的单独类.
可以是一个简单的标记类
class ReturnValues {}
Run Code Online (Sandbox Code Playgroud)
或更具功能性的东西
class ReturnValues implements Countable
{
protected $values;
public function __construct() { $this->values = func_get_args(); }
public function __get($key) return $this->values[$key]; }
public function count() { return count($this->values); }
}
Run Code Online (Sandbox Code Playgroud)
当然,它并没有做太多的事情,并且从中获取价值仍然是通过一个隐含的界面完成的,但至少该类现在有更明确的责任.您可以从此类扩展为特定操作创建ReturnValue对象,并为这些对象提供显式接口:
class FooReturnValues extends ReturnValues
{
public function getFoo() { return $this->values['foo']; }
public function getBar() { return $this->values['foo']; }
}
Run Code Online (Sandbox Code Playgroud)
现在开发人员只需查看API就可以知道foo()将返回多个值.当然,必须为可能返回多个值的每个操作编写具体的ReturnValue类可能会很快变得乏味.而且就个人而言,我发现这个过度工程是为了最初的目的.
无论如何,希望是有道理的.
| 归档时间: |
|
| 查看次数: |
15200 次 |
| 最近记录: |