如何在创建具有重复键的数组时出错?

时间:2017-09-06 17:44:26

标签: php arrays hashmap syntax-error

阅读器,

我最近在调试中失去了40分钟,因为同事错误地重复行并且PHP没有触发任何错误。

原始行类似于

$files = [
    'identifier1' => '/path/to/file1'
];

复制后的预期行

$files = [
    'identifier1' => '/path/to/file1',
    'identifier2' => '/path/to/file2',
    'identifier3' => '/path/to/file3'
];

线条是如何

$files = [
    'identifier1' => '/path/to/file1',
    'identifier1' => '/path/to/file2',
    'identifier1' => '/path/to/file3'
];

相同
$files = [
    'identifier1' => '/path/to/file3'
];

当您错误地尝试使用重复键定义数组时,有没有办法让php触发错误(即使它只是一个警告)?

我们希望全局启用该选项,而error_reporting(E_ALL)不能正常工作。

2 个答案:

答案 0 :(得分:0)

这不是PHP中的错误。它只是覆盖键/值对。

检查此问题的唯一方法是在定义count()之后检查$files以确认它有多少您认为应该的项目。如果计数太低,您可以抛出Exception或记录错误。

答案 1 :(得分:0)

如果您将源提供为预构建阵列:

""           // the whole document
"/foo"       ["bar", "baz"]
"/foo/0"     "bar"
"/"          0
"/a~1b"      1
"/c%d"       2
"/e^f"       3
"/g|h"       4
"/i\\j"      5
"/k\"l"      6
"/ "         7
"/m~0n"      8

然后根本无法通过运行时检查来检测重复的密钥,因为这段代码的编译就像是:

$list = [
    'one' => 1,
    'two' => 2,
    'one' => 3,
];

即,重复的密钥在您的代码运行之前基本上消失了,您编写的任何代码都将永远不会看到第一个条目。如果您将代码编写为单独的行:

$list = [
    'two' => 2,
    'one' => 3,
];

然后你有几个选择。您可以创建一个实现$list['one'] = 1; $list['two'] = 2; $list['one'] = 3; 的类,然后编写ArrayAccess方法以检查在写入新偏移量时是否已存在给定的偏移量。无论数组在哪里,该类基本上都可用。

offsetSet()

我想这可能比它的价值更麻烦。

唯一真正的选择是静态代码分析。您可以为PHPCS编写自己的嗅探,试图在实际源代码中找到这些重复的键实例。请注意,这将需要在源代码上运行分析工具来检测问题。