阅读器,
我最近在调试中失去了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)不能正常工作。
答案 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编写自己的嗅探,试图在实际源代码中找到这些重复的键实例。请注意,这将需要在源代码上运行分析工具来检测问题。