我可以使用实例化的Object作为数组键吗?

Tyl*_*ylo 31 php arrays object

例如:

$product = new Product("cat");

if(isset($sales[$product])){
     $sales[$product]++;
}
else{
     $sales[$product] = 1;
}
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 47

来自文档:

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

您可以为每个实例提供唯一的ID或覆盖__toString(),以便它返回一些独特的内容,例如

$array[(string) $instance] = 42;
Run Code Online (Sandbox Code Playgroud)

  • +1为生命,宇宙和一切的答案 (7认同)
  • ...让我们把他的分数提高到42并保持这种方式,人们^ _ ^ (6认同)

goa*_*oat 24

您可以使用http://www.php.net/manual/en/class.splobjectstorage.php

$product = new Product("cat");
$sales = new SplObjectStorage();
if(isset($sales[$product])){
     $sales[$product]++;
}
else{
     $sales[$product] = 1;
}
Run Code Online (Sandbox Code Playgroud)

它不是一个真正的数组,但具有相当数量的类似数组的功能和语法.但是,由于它是一个对象,由于其奇怪的foreach行为,它在php中表现得像一个错配,并且它与所有本机php数组函数不兼容.有时您会发现通过它将其转换为真实数组很有用

$arr = iterator_to_array($sales);
Run Code Online (Sandbox Code Playgroud)

所以它与你的其余代码库一起玩得很好.


小智 17

有一个spl_object_hash函数,用于将唯一对象id作为字符串获取,可用作数组键.http://php.net/manual/en/function.spl-object-hash.php

  • 实际上来自文档:当一个对象被销毁时,其“哈希”可能会被其他对象重用**。因此,通常,按照山羊建议使用SplObjectStorage是更好的主意。 (2认同)