PHP中的硬编码嵌套数组?好坏练习?

时间:2010-12-25 15:17:09

标签: php anti-patterns

我最近与一位同事讨论了一个代码示例,其中person使用数组的嵌套。我们开始讨论在代码中使用嵌套数组的问题。

当我们将参数传递给生成器等时,有时使用嵌套数组会更容易。我认为在这些情况下使用嵌套数组是可以的,但最好使用类和良好的验证。

第二,当我们拥有XML,HTML,JSON或其他解析器时,它们通常也会返回嵌套数组。我认为在这些场景中使用嵌套数组也是可以的。

那么当使用嵌套数组时不行吗?

我认为,当我们使用它们与上述场景无关时。特别是当我们在源代码中使用硬编码嵌套数组时,如下例所示:

$data = array(array('cat', 12),
array('dog', 15),
array('turtle', 4));

我认为当你经常使用硬编码的嵌套数组时,这可以被视为一种可能的编程反模式。你没有验证,混乱的代码,可能有bug。而我的同伴不是这样的,并告诉它不是反模式,因为在编程中使用嵌套数组是没关系的,没有理由告诉其他不行的。

请问您能否帮我们决定是否可以将其视为反模式使用硬编码嵌套数组?

所有优点和缺点都会受到谴责!

2 个答案:

答案 0 :(得分:2)

取决于。

在某些情况下,嵌套数组非常适合。在其他情况下,您不希望显式创建对象,使用嵌套数组会更快更短。<​​/ p>

当然,通过使用数组而不是对象,数组项的含义就会丢失。在您的示例中,读取代码的人不知道嵌套数组中的第二项是动物的年龄,也可能是其权重,或者是数据库中宠物所有者的标识符。另一方面,如果您提供这样的对象数组:

class Animal
{
    public $animal;
    public $age;
}

第二项的含义变得更容易理解。

这并不意味着“验证”会更容易,但它更像是语言的问题。例如,没有禁止做的事情:

$someDog = new Animal();
$someDog->animal = 12;
$someDog->age = 'Cat';

嵌套数组在强类型语言中可能是一件坏事。例如,在C#中,Collection<object>可能不是最好的事情:你不知道每个对象的属性是什么,这些对象是什么等等。当你有Collection<Animal>时:

  • 您确定的每个项目都是Animal
  • 您知道每个项目可用的精确属性是什么,以及它们的类型。如果Animal具有类型为Age的属性int,则您知道集合中的每个项都具有此属性,并且其值为整数。 (注意:如果Animal对象由扩展它的另一个对象继承,则单独的项可能具有其他属性,但在所有情况下,Age属性都可用。)

同样的事情在PHP中只能部分工作。例如,您无法确定数组中对象之间相同属性的类型是否始终相同,因此需要进行验证。


我的个人观点:在像PHP这样的语言中,我宁愿使用嵌套数组,当有理由使用对象时,更快更容易使用嵌套数组和对象。

答案 1 :(得分:1)

不知道这是否有效,但是根据你的代码片段,我会采用另一种方法:

$data = array('cat'=>12,
              'dog'=>15,
              'turtle'=>4,
             );

如果动物有更多属性,你可以这样做:

$data = array('cat'=>array(12, 'attr'),
              'dog'=>array(15, 'attr'),
              'turtle'=>array(4, 'attr'),
             );

这完全取决于数据的走向:

类与数组

相关问题