Сюрпризы PHP для бэкенда на 1С‑Битрикс: параметры, float, инкременты и сериализация
Зачем это битрикс‑разработчику
Проект на «1С‑Битрикс: Управление сайтом» по-прежнему крутится на том же PHP, что и ваши обработчики событий, агенты и интеграционные скрипты. Ниже — пересказ классических «ловушек» языка своими словами: не для викторины, а как чеклист, откуда берутся странные баги в каталоге, ценах и кастомных модулях.
Дублирующиеся имена параметров
В ранних версиях PHP допускалось объявить в сигнатуре два параметра с одинаковым именем: последний выигрывал, а func_get_args() при этом показывал фактически переданные значения. Начиная с PHP 7 разбор такой функции завершается фатальной ошибкой перекрытия параметра — это защита от тихой путаницы в наследовании и автозагрузке. Любой легаси‑код с таким приёмом нужно переписать на разные идентификаторы до обновления интерпретатора на проде.
function pair($slot, $slot) {
return $slot;
}
echo pair('first', 'second');Два постфиксных инкремента подряд
Выражение с двумя ++ после одной переменной опирается на порядок вычисления операндов: сначала оба $k++ отдают старые нули и планируют увеличения, затем сумма складывается, после чего переменная дважды становится единицей. Итоговое значение присваивания часто удивляет тех, кто ожидал «0 + 1 + 2». В обработчиках заказов и скидок такие конструкции лучше не писать вообще — читаемый цикл или явные шаги дешевле сопровождения.
$k = 0;
$k = $k++ + $k++;
var_dump($k);Деньги, float и целое сравнение
Десятичные литералы в binary floating point не всегда равны «бумажной» сумме: умножение рубля с копейками на 100 может дать 16097.999… вместо 16098. Для денег в каталоге и CRM надёжнее хранить минимальную валютную единицу целым, пользоваться round с явной точностью или bcmath. Прямое сравнение (int)$x === целое после цепочки * — распространённый источник ложных срабатываний в самописных проверках скидок.
$sum = 160.98;
$sum *= 100;
var_dump((int)$sum === 16098);Логическое «не» и приведение типов
Оператор ! сначала приводит значение к булеву виду по правилам PHP: ноль — ложь, ненулевое число (включая отрицательное) — истина, пустая строка — ложь, непустая — истина. Поэтому !(-1) даёт false, а !("") — true. В валидации полей веб‑форм и REST это стоит помнить при проверках «пусто / не пусто» на сырой строке против числа.
serialize, unserialize и модификаторы свойств
Снимок объекта в строке запоминает имя класса и набор полей с метаданными видимости. Если между сериализацией и десериализацией изменить у свойства модификатор (например, с private на protected), поведение зависело от версии PHP: в старых ветках часть данных могла восстановиться некорректно, в более новых — механизм стал согласованнее. Для кешей и сессий выбирайте вменяемые DTO и версионируйте формат; никогда не передавайте в unserialize() недоверенные данные от пользователя. Публичный unserialize на вводе — прямой путь к RCE, что важно учитывать и в облачных интеграциях вокруг Битрикс24.
// Учебный пример: менять сигнатуры класса между сохранением и загрузкой
// строки опасно для продакшена; здесь только иллюстрация идеи версий формата.
final class DemoBox {
private string $note = 'old';
}
$wire = serialize(new DemoBox());
// Реальный рефакторинг класса между serialize и unserialize требует
// миграции формата, а не «тихого» изменения модификаторов.Кратко
- Следите за чистотой сигнатур функций перед апгрейдом PHP на боевом кластере.
- Не экономьте символы на инкрементах в бизнес‑логике — ясность важнее.
- Финансовые расчёты ведите через целые минимальные единицы или проверенные математические расширения.
- Явно различайте проверки строк и чисел; не полагайтесь на неявное
!для «пустоты». - Сериализация — для доверенных границ; смена контракта класса без миграции данных ломает совместимость.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии