Можно ли использовать экземпляр Object как Array Key?

Например:

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

Из документов :

Массивы и объекты не могут использоваться в качестве ключей. Это приведет к предупреждению: тип недопустимого смещения.

Вы можете дать каждому экземпляру уникальный идентификатор или переопределить __toString() таким образом, чтобы он возвращал что-то уникальное и, например,

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

Существует функция spl_object_hash для получения уникального идентификатора объекта как строки, которая может использоваться как ключ массива. http://php.net/manual/en/function.spl-object-hash.php

Вы можете использовать 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 из-за его нечетного поведения foreach и его несовместимости со всеми встроенными функциями массива php. Иногда вам будет полезно преобразовать его в реальный массив через

 $arr = iterator_to_array($sales); 

поэтому он отлично играет с остальной частью вашей кодовой базы.

В качестве ключей массива допускаются только целые числа и строки . Вы можете написать класс, который реализует ArrayAccess, если вам абсолютно нужна эта функциональность.

Если объект является простым предопределенным классом, созданным с помощью new stdClass() он может быть допустимым вариантом использования json-представления этого класса с json_encode .

 $product = new stdClass(); $product->brand = "Acme"; $product->name = "Patator 3.14"; $product_key = json_encode($product); if(isset($sales[$product_key])){ $sales[$product_key]++; } else{ $sales[$product_key] = 1; } 

Но имейте в виду, что равенство двух объектов всегда является выбором бизнес-модели и должно быть тщательно спроектировано.