Для вызова пользовательских функций из встроенной/внутренней функции вы должны
использовать функцию call_user_function().
call_user_function() возвращает SUCCESS при успешном выполнении и FAILURE, если функция не найдена.
Вы должны проверять это return-значение! Если возвращено SUCCESS, вы сами
отвечаете за уничтожение retval pval (или возвращение его как return-значения
вашей функции). Если возвращено FAILURE, значение retval будет
undefined, и вы обязаны не использовать его.
Все внутренние функции, вызывающие пользовательские функции, обязаны
быть reentrant (?). Помимо всего прочего это означает, что они обязаны не
использовать глобальные или статические переменные.
call_user_function() принимает 6 аргументов:
Это хэш-таблица, в которой функция просматривается.
Это указатель на объект, в котором функция вызывается. Это должен быть NULL, если
вызывается глобальная функция. Если это не NULL (т.е. имеется указатель на объект), аргумент function_table игнорируется и
вместо этого берётся из хэша объекта. Объект *может*
быть модифицирован функцией, которая вызывается в нём (эта функция будет
иметь к нему доступ через $this). Если по каким-то причинам вам это не
нужно, отправляйте копию объекта. Имя вызываемой функции. Обязано быть pval типа
IS_STRING с соответствующими установленными значениями в function_name.str.val и в function_name.str.len.
function_name модифицируется с помощью call_user_function() - оно конвертируется в нижний регистр.
Если необходимо сохранить регистр символов, отправляйте копию имени функции.
Указатель на pval-структуру, в которой сохраняется return-значение
вызванной функции. Структура должна быть предварительно размещена - call_user_function()
сама НЕ размещает её.
Количество параметров, передаваемых функции. Массив указателей на значения, которые передаются функции как аргументы;
первый аргумент имеет смещение 0, второй - 1, и т.д. Этот массив является массивом указателей на pval'ы; Указатели
отправляются as-is/как-есть в функцию, что означает, что, если функция
модифицирует свои аргументы, оригинальные значения изменяются (передача по ссылке).
Если вам не нужно такое поведение, передавайте копию. |