【问题标题】:Hardcoded nested arrays in PHP? Good or bad practice?PHP中的硬编码嵌套数组?好习惯还是坏习惯?
【发布时间】:2010-12-25 15:17:09
【问题描述】:

我最近与一位同事讨论了一个人使用数组嵌套的代码示例。我们开始讨论一般代码中嵌套数组的使用。

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

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

那么什么时候不能使用嵌套数组呢?

我认为这是我们在与上述场景无关的情况下使用它们的时候。尤其是当我们在源代码中使用硬编码的嵌套数组时,如本例所示:

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

我认为当您经常使用硬编码的嵌套数组时,这可以被视为一种类似于编程的反模式。您没有验证,代码混乱,可能有错误。而我的伙伴却不是这样,说这不是反模式,因为在编程中使用嵌套数组是可以的,没有理由告诉其他人这不行。

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

所有的优点和缺点都会被欣赏!

【问题讨论】:

    标签: php anti-patterns


    【解决方案1】:

    视情况而定。

    在某些情况下嵌套数组非常适合。还有一些你不想显式创建对象的情况,使用嵌套数组会更快更短。

    当然,通过使用数组而不是对象,数组项的意义就丢失了。在您的示例中,阅读代码的人不知道嵌套数组中的第二项是否是动物的年龄,或者它的体重,或者是数据库中宠物主人的标识符。另一方面,如果您提供这样的对象数组:

    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 这样的语言中,当使用嵌套数组更快更容易时,我宁愿使用嵌套数组,当有理由使用对象时,我更愿意使用对象。

    【讨论】:

    • 作为回应(作为额外的):如果您想保留数组中的含义,您可以执行以下操作:$animal = array('cat'=>array('age'=>12, 'color'=>'white'), 'dog'=>array('age'=>3, 'color'=>'black')); 如前所述,这完全取决于数据和您想要的内容处理它。
    • @PeeHaa:就我个人而言,我将动物视为财产,而不是列表中的键。换句话说,会有几只猫,几只狗,等等。
    • 没关系,正如我所说的,这完全取决于数据以及发布者想要用它做什么。我没有说你错了,我也没有说我的解决方案是要走的路。只是想分享一些不同的方法。当将动物视为一种属性时,仍然可以将数组用于几只狗/猫等。只需要调整数组即可。你通过说 $somedog 来做基本相同的事情。该数组看起来像$animals = array('somedog', array('type'=>'dog', 'age'=>3, 'color'=>'black'));。再次,我只是想向海报展示一种可能的方法。
    • @myself:(我不能再编辑了)。我犯了一个小错误。代码应为:$animals = array('somedog'=>array('type'=>'dog', 'age'=>3, 'color'=>'black')); ofc。 :)
    【解决方案2】:

    不知道这是否可行,但是根据您的代码 sn-p 我会采用另一种方法:

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

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

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

    这完全取决于数据走哪条路:

    类与数组

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 2013-07-17
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多