← К заметкам

Заметки

Почему PHP-функция в БП даёт Cannot redeclare при массовом запуске

Именованная функция, объявленная внутри PHP-действия БП, попадает в область функций PHP. Если несколько экземпляров процесса выполняются в одном запросе, повторное объявление даст Cannot redeclare.

Для небольшой локальной операции подойдёт замыкание:

$fn_normalize_phone = static function (string $s_phone): string {

	return preg_replace('/\D+/', '', $s_phone);
};

$s_phone = $fn_normalize_phone((string) $s_raw_phone);

Здесь $s_raw_phone — строка, полученная ранее в действии. Такое преобразование только удаляет нецифровые символы; полноценной нормализацией международного номера оно не является.

Общую логику лучше вынести в класс собственного модуля и загрузить один раз. Обёртка function_exists уберёт повторное объявление, но при разных версиях функции сохранит ту, которая загрузилась первой.

Тот же конфликт возможен у двух PHP-действий, которые работают по отдельности, но падают при последовательном запуске, или при повторении действия в цикле. В интерфейсе иногда видна только ошибка Network error. Она сама по себе не доказывает причину: ищите Cannot redeclare в серверной записи об ошибке.

Документация: Пользовательские функции PHP; Анонимные функции PHP.