Приведу пример. В каком-то участке кода с пользовательского счёта нужно снять N-ую сумму. Естественно, прежде чем снять, нужно проверить, есть ли эта сумма в его переменной. Так вот. В данной ситуации прибавляется ещё пара-тройка проверок: есть ли счёт, когда появился счёт и т.п. И самое важное, что после любой отрицательной проверки счёта нужно сообщать об этом пользователю, и прерывать участок кода.
И этот участок когда (с проверками счета и снятием суммы) нужно дублировать во многих местах кода, только суммы разные.
Если всё внести в функцию, которая в качестве аргумента примет сумму, то тоже выход. Но тут есть одно НО. Если в участке кода, до снятия суммы, мы сообщим пользователю что сняли, а следующей строкой будет вызов этой функции, которая выяснит, что у пользователя нет такой суммы, то будет не совсем корректно. В таком случае, использую данный подход стоит всегда учитывать вызов данной функции на первом месте в участке кода.
А проблема-то в чем? Выносите в функцию, функция возвращает true если снятие точно прошло успешно. В нее же все проверки... И если возвращено true - сообщать что снято.
Urukhayy: takeMoney ни в коем случае не должна выводить пользователю сообщение.
Если нужно, можно так сделать:
$result = takeMoney(100);
printTakeMoneyResult($result);
или даже так:
printAndTakeMoney(100);
function printAndTakeMoney($amount){
$result = takeMoney(100);
printTakeMoneyResult($result);
}
это если очень хочется.
Т.е. всегда нужно разделять код отвечающий за работу с изменением данных, и с выводом данных пользователю.
Всегда будет 1 или 2 момента, когда надо просто снять деньги, но ничего выводить не нужно.
Для решения похожих проблем используется подход Аспектно-Ориентированного Программирования (АОП). Почитать можно Здесь (вики) Здесь (хабр) Здесь (почти книжка)
Поддержка обеспечивается с помощью фреймворков типа AspectJ, Aspect#, Aspect.NET и кучей других.