Колупаю код, полученный в наследство от osCommerce. Ну, я понимаю, написано было в жутком 2003 году, тогда на PHP4 все не особо спешили переходить. Но это вообще шедевыръ.
Значит, хлопцы из команды просекли, что PHP уже 4 и там можно ООП. Похоже, они одним полушарием прохавали, что ООП — это круто. Но почему круто, и как им пользоваться, другое полушарие сим вопросом не особо задавалось. В результате вышло, что им дали в руки нечто хрупкое и хрустальное.
Короче говоря, есть идея, что когда пользователь набрал в корзину товаров и хочет их купить, в действие вступают несколько так называемых order-total-модулей. Ну там например, один вычисляет, сколько там в общем счете налога, другой — скидку за лояльность, третий вообще строчку «всего». Реализовано как кучка классов с общим интерфейсом.
Эта хорошая идея нашла каквсегдашнюю реализацию. Они сделали глобальную переменную $order, с которой эти модули работают по очереди. То бишь, в методе getTotal() там первой строчкой идет global $order; и далее по тексту.
Из этой реализации следует целая куча побочных эффектов. По идее, модули — это нечто отключаемо-взаимозаменяемое, но по факту, отключив один модуль, можно получить неправильный результат у всех остальных. Кроме того, если они в цикле будут прокручиваться в слегка не том порядке, покупатель будет должен уже другую сумму. Ну и из-за этой манипуляции глобальной переменной, отладка напоминает искусство вуду во всей красе.
Вот такой вот ШЗН. (ШЗН = ШоЗаНах, WTF по-русски)
Мораль сей басни такова. Если вы начинаете внедрять какую-либо парадигму, услышав неделю назад, что это круто, скорее всего, вы делаете это неправильно, и скорее всего, все последующие мэйнтейнеры вашего кода захотят оторвать вам руки.