在工作中进行大量重构的中间,我希望引入stdClass *****作为从函数返回数据的一种方式,并且我试图找到非主观论据来支持我的决定。
在任何情况下,何时最好使用一种而不是另一种?
使用stdClass而不是数组有什么好处?
有人会说,函数必须尽可能少且特定,才能返回一个值。我决定使用stdClass是暂时的,因为从长远来看,我希望为每个进程找到正确的Value Objects。
在工作中进行大量重构的中间,我希望引入stdClass *****作为从函数返回数据的一种方式,并且我试图找到非主观论据来支持我的决定。
在任何情况下,何时最好使用一种而不是另一种?
使用stdClass而不是数组有什么好处?
有人会说,函数必须尽可能少且特定,才能返回一个值。我决定使用stdClass是暂时的,因为从长远来看,我希望为每个进程找到正确的Value Objects。
Answers:
通常的方法是
返回带有固定分支的已定义数据结构时,请使用对象:
$person
-> name = "John"
-> surname = "Miller"
-> address = "123 Fake St"
返回列表时使用数组:
"John Miller"
"Peter Miller"
"Josh Swanson"
"Harry Miller"
返回结构化信息列表时,使用对象数组:
$person[0]
-> name = "John"
-> surname = "Miller"
-> address = "123 Fake St"
$person[1]
-> name = "Peter"
-> surname = "Miller"
-> address = "345 High St"
对象不适合保存数据列表,因为您始终需要一个密钥来寻址它们。数组可以同时实现两个功能-容纳任意列表和数据结构。
因此,如果需要,您可以在第一个和第三个示例中对对象使用关联数组。我会说,这实际上只是样式和偏好的问题。
@Deceze在何时使用对象方面有很多好处(验证,类型检查和将来的方法)。
我不认为使用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); }
以上所有方法均有效。数组是一个很小的微不足道的部分,速度更快,打字工作更少。与通用stdClass相比,它还有一个明确定义的目的(有点麻烦,不是吗)。两者都只有一个隐式接口,因此您必须查看文档或函数体以了解它们将包含什么。
如果您想不惜任何代价使用对象,则可以使用ArrayObject或SplFixedArray,但是如果您查看它们的API,您会说需要它们的功能来完成返回随机多个值的简单任务吗?我不这么认为。但是请不要误会我的意思:如果要使用stdClass,请使用它。它不会破坏任何东西。但是您也不会获得任何收益。为了至少增加一些好处,您可以为此创建一个单独的名为ReturnValues的类。
可能是简单的标记类
class ReturnValues {}
或更实用的功能
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); }
}
当然,它并没有做很多事情,并且仍然可以通过一个隐式接口来获取其价值,但至少现在该类具有更明确定义的职责。您可以从此类扩展以为特定操作创建ReturnValue对象,并为它们提供一个显式接口:
class FooReturnValues extends ReturnValues
{
public function getFoo() { return $this->values['foo']; }
public function getBar() { return $this->values['foo']; }
}
现在,开发人员只需查看API即可知道foo()将返回哪个值。当然,必须为每个可能返回多个值的操作编写具体的ReturnValue类,可能很快就会变得乏味。就个人而言,我发现这是出于最初目的而过度设计的。
无论如何,希望这是有道理的。
stdClass
仅是关联数组的替代表示。
$options = ['a'=>'str', 'b'=>'str'];
几乎一样优雅,并允许为数组构建许多本机/强大的功能。因此,除非需要匹配JSON结构,否则我会坚持使用数组。
我能找到的唯一的目标信任票是:
json_decode
默认情况下使用stdClass,因此在类似情况下,userland中的凡人应该使用stdClass。
json_decode($json, true);
如果您要获取数组而不是对象,则可以使用
当我需要保持代码整洁和有点句子可读性时,我发现数组上的stdClass对象很有用。以getProperties()
返回一个属性集的函数为例,例如关于一个人的数据(姓名,年龄,性别)。如果getProperties()
要返回一个关联数组,则当您要使用返回的属性之一时,应编写两条指令:
$data = getProperties();
echo $data['name'];
另一方面,如果getProperties()
返回stdClass,则可以只用一条指令编写它:
echo getProperties()->name;
echo getProperties()['name'];
3v4l.org/t6i0r
在数组与stdclass的测试中,php处理动态属性的方式要比关联数组慢。我并不是说这是在争论微优化,而是如果您打算这样做,最好定义没有方法的数据类并设置公共属性。Esp,如果您使用的是php 5.4+。在幕后,定义的属性直接映射到没有散列表的ac数组,而动态列表则需要使用散列表。
这样做的好处是,以后无需进行任何主要的界面修改即可成为完整的类。