2012-12-10 117 views
3

PHP documentation状态:为什么对象不允许作为关联数组中的键?

数组和对象不能被用作密钥。这样做会导致警告:非法偏移类型。

据我所知,PHP数组是有序的哈希地图。那么,为什么它本身被禁止使用对象作为键,是否有这个限制的原因?为什么不可能在类中实现散列函数以便将其用作关键字?

与此相关的,是有一个哈希地图,解决这个问题的一个PHP实现?

+1

相关:[SplObjectStorage](http://php.net/class.splobjectstorage),可在5.3 。 – Charles

+0

@Charles像一个魅力,thx! – rob

回答

3

密钥必须是不可改变的,以便他们合作。如果你的对象是可变的,那么它们不能是键。 Java和C#等

+0

问题(我不是专家,只是好奇):如果对象有一个内存地址(我猜),这个内存地址不会改变(我猜?) - 如果这样的内存地址不改变,为什么这样的地址没有用作这个的关键? – Voldemort

+0

@Omega,有趣。有些语言的确可以做这样的事情。但是,这需要* runtime *名称和内存地址之间的中间转换映射。此外,这对于内置内存管理的语言也会产生影响。 –

+1

@duffymo我明白键必须是不可变的,但它不应该是程序员的责任只使用一类的不变域生成散列? (就像在Java中一样) – rob

2

见@duffymo的答案:在每一个实现他们的语言是真的。

请注意,有一个“变通办法”的种类,通过使用spl_object_hash作为您的关键。这将返回一个字符串,该字符串是不可变的,可以用作键,并且对于占用该内存地址的任何对象都是相同的。 (阅读:spl_object_hash将返回相同的值为同一实例,无论它被称为或如果对象已更改)

+0

不幸的是,即使对象相同,“spl_object_hash”在每个脚本调用中都会返回不同的值。这会让人感觉不方便。 – Charles

+0

那么,根据定义,它们并不相同。他们是不同的对象。你需要实现你自己的'equals'方法,或类似的东西。更好的问题:为什么你需要在哈希映射中进行交叉调用比较?为什么不找一种方法为这些对象创建唯一的标识符,并将它们保存在为此而设计的系统中? –

相关问题