是否可以将实例化对象用作数组键?

2022-08-30 11:38:21

例如:

$product = new Product("cat");

if(isset($sales[$product])){
     $sales[$product]++;
}
else{
     $sales[$product] = 1;
}

答案 1

文档中

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

您可以为每个实例指定一个唯一的ID或覆盖__toString(),以便它返回唯一的东西并执行例如

$array[(string) $instance] = 42;

答案 2

您可以使用 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;
}

它不是一个真正的数组,但具有相当数量的类似数组的功能和语法。但是,由于它是一个对象,由于其奇怪的前置行为,并且与所有本机php数组函数不兼容,因此它的行为就像php中的不合适。有时你会发现通过

$arr = iterator_to_array($sales);

因此,它与代码库的其余部分配合得很好。