Подтвердить что ты не робот

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

Например:

$product = new Product("cat");

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

Ответ 1

Из docs:

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

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

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

Ответ 2

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

Ответ 3

Вы можете использовать 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);

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

Ответ 5

Если объект является простым предопределенным классом, созданным с помощью 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;
}

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