Поведение объекта PHP по умолчанию, как и во многих других языках, заключается в том, что ключ должен быть уникальным.Если он существует, он будет обновлен.
Другого обходного пути нет, если только вы не хотите просто сделать это значение ключа массивом и добавить его, если вы установите значение для существующего ключа.
Например,
$obj = (object) [];
$obj->{'key1'} = 'val1';
Объект:
object(stdClass)#1 (1) { ["key1"]=> string(4) "val2" }
$obj = (object) [];
$obj->{'key1'} = array();
$obj->{'key1'}[] = 'val1';
$obj->{'key1'}[] = 'val2';
А теперь объект:
object(stdClass)#1 (1) { ["key1"]=> array(2) { [0]=> string(4) "val1" [1]=> string(4) "val2" } }
Исходя из того, что вы можете создать пользовательский объект, который делаетчто когда вы присваиваете значение существующему ключу:
class MyObj {
private $data = array();
public function __set($key, $val) {
if (array_key_exists($key, $this->data)) {
if (!is_array($this->data[$key])) {
$this->data[$key] = array($this->data[$key], $val);
} else {
$this->data[$key][] = $val;
}
} else {
$this->data[$key] = $val;
}
}
public function __get($key) {
if (array_key_exists($key, $this->data)) {
return $this->data[$key];
}
}
}
Итак, теперь вы устанавливаете их так:
$obj = new MyObj();
$obj->key1 = 'val1';
$obj->key2 = 'val2';
$obj->key1 = 'val3';
И результат:
<code>echo '<pre>';
print_r($obj->key1);
echo '
';Массив ([0] => val1 [1] => val3)