Pull to refresh

Comments 10

Спасибо за статью.

А какими ресурсами вы пользовались для поиска какой макрос что делает или какой макрос нужен, чтобы выполнить нужное действие?

Тоже в свободное время «копаю» исходники php, и, зачастую, тратится больше всего времени именно на поиск макроса.
Просто смотрю расширения и потом если вижу что-то подходящее, то делаю grep по всему исходнику.
На php я думаю было бы так:
$array = [1,2,3];
$number = array_sum($array);
$count = count($array);
Возможно и в исходниках подобное есть.
Спасибо, что напомнили, для интереса посмотрел реализацию кода, грубо говоря тот же подход, за исключением, проверки типа данных и использования внутренней функции fast_add_function

PHP_FUNCTION(array_sum)
{
        zval *input,
                 *entry,
                 entry_n;

        if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &input) == FAILURE) {
                return;
        }

        ZVAL_LONG(return_value, 0);

        ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(input), entry) {
                if (Z_TYPE_P(entry) == IS_ARRAY || Z_TYPE_P(entry) == IS_OBJECT) {
                        continue;
                }
                ZVAL_COPY(&entry_n, entry);
                convert_scalar_to_number(&entry_n);
                fast_add_function(return_value, return_value, &entry_n);
        } ZEND_HASH_FOREACH_END();
}

если можно, поправьте тэги к посту. плиз :)
Когда писал расширения помогал хороший бложек: https://adobkin.com/. Там много информации про устройство зенда и плюшек PHP. Возможно кому-то будет полезно.
За предыдущую статью честно хотел поставить минус, но не успел. А вот за эту — плюсанул.
Одно смутило:
Для наглядности приведу из справочника все макросы:


Из какого собственно справочника?

P.S.
Мне нужно портировать свой маленький экстеншн с 5.6 на 7, и я запнулся именно на массивах, и в т.ч. на аргументах, которые передаются по ссылке. Если будете продолжать — напишите пожалуйста про аргументы, которые передаются по ссылке :)
Изучаю исходники PHP просто ради спортивного интереса.

https://wiki.php.net/phpng-upgrading

А что за расширение писали?

Огромное спасибо!


Расширение писал для ускорения кода для "внутренних нужд". Различные нативные альтернативы фолбэкам на чистом PHP, например, получение значения многомерного массива по ключу вида firstLevel.secondLevel.thirdLevel ([firstLevel => [secondLevel => [thirdLevel => someValue]]]). Ну и куча прочих функций для "микооптимизаций".

Sign up to leave a comment.

Articles