什么时候我应该使用stdClass什么时候我应该在php oo代码中使用数组?

Jon*_*onG 68 php oop stdclass

在工作中大量重构的过程中,我希望引入stdClass*****作为从函数返回数据的方法,并且我试图找到支持我的决定的非主观参数.

是否有任何情况何时最好使用一个而不是另一个?

使用stdClass而不是数组会有什么好处?


有些人会说函数必须尽可能少且具体,才能返回单个值.我决定使用stdClass是暂时的,因为我希望从长远来看为每个进程找到正确的Value Objects.

Pek*_*ica 60

通常的做法是

对象不适合保存数据列表,因为您始终需要一个键来解决它们.数组可以实现两种功能 - 保持任意列表和数据结构.

因此,如果需要,可以在第一个和第三个示例的对象上使用关联数组.我会说这只是一个风格和偏好的问题.

@Deceze在何时使用对象(验证,类型检查和未来方法)方面提出了许多好处.

  • 我强烈反对这一点.如果您拥有的只是数据,甚至是结构化数据,那么您应该使用数组.对象是数据包和相关行为.使用stdClass作为数组只是滥用stdClass. (11认同)
  • 同意GordonM,使用stdClass对正确对象的错觉导致更多的伤害然后是好的.几乎所有我看到stdClass使用它的情况总是滥用动态属性 - 这使得类的结构非常混乱,即使该结构受到尊重,因为几乎每次使用它都涉及"动态"填充属性.如果您可能会错过属性或者无法创建实际的类,那么不妨使用数组. (4认同)

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相比,它也有一个明确定义的目的(有点白痴,不是这样).两者都只有一个隐式接口,因此您必须查看文档或函数体以了解它们将包含的内容.

如果你想不惜任何代价使用对象,你可以使用ArrayObjectSplFixedArray,但是如果你看看他们的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类可能会很快变得乏味.而且就个人而言,我发现这个过度工程是为了最初的目的.

无论如何,希望是有道理的.