Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function set($arr, $key, $val)
{
...
if ($arr->flags & HASH_FLAG_PACKED) {
if ($key < 0) {
goto convert_to_hash;
}
if ($key < $arr->lastUsedKey) {
if ($arr->data[$key]->type !== TYPE_VAR_UNDEFINED) { // TYPE_VAR_UNDEFINED в данном случае значит что это неинициализированная переменная (ей ничего не присвоили, даже null)
// добавим этот элемент в массив, он должен нормально туда влезть, заменив какой-то из уже существующих по этому индексу
} else {
// если по такому ключу ничего нет (но при этом после него есть ключи, которые мы использовали), то превращаемся в хештаблицу, т.к. только с ней мы сможем соблюсти такой порядок элементов
goto convert_to_hash;
}
} elseif ($key < $arr->tableSize) { // если ключ больше самого большого ключа из этого массива, но меньше чем кол-во заранее инициализированных бакетов (это число всегда кратно 2)
// просто добавим этот элемент сюда
} elseif ($key < $arr->tableSize * 2 && $arr->tableSize - $arr->lastUsedKey < $arr->tableSize / 2) { // если ключ больше чем кол-во преинициализированных бакетов, но меньше чем это же число умноженное на два, и при этом если мы уже используем больше половины бакетов
// инициализировать в два раза больше бакетов чем есть сейчас, и переместить туда их
// добавить элемент
} else {
goto convert_to_hash;
}
}
convert_to_hash:
...
}
Кстати rrromka приведённый в начале пример не имеет никакого отношения к Zval.
f1 меняет тип переданного zval-а, по этому внутри неё срабатывает copy-on-write и объект снаружи функции остается без изменения. Функция f2 тип не меняет, по этому копироания-при-записи нет и меняется zval снаружи функции.f1 и f2 ведут себя по разному, то понимать структуру zval и zvalue_value нужно.
Изучаем PHP изнутри. Zval