Неоправданное использование ООП

Парадигма ООП - замечательный подход к написанию кода. У ООП есть множество неоспоримых преимуществ, самое значительное из которых - возможность использовать заново уже некогда написанный код. Однако все мы рано или поздно осознаём тот факт, что 'PHP - не объектно-ориентированный язык'.

Несмотря на то, что PHP имеет корректно работающую поддержку объектов, использовать объекты там, где можно без них обойтись - недальновидно и неэффективно. Причина? Дело в том, что поддержка парадигмы ООП в PHP реализована не в полном объёме.

Несмотря на присутствие основных элементов, PHP всё-таки не хватает многих "продвинутых" функций (как защищённые члены или закрытые переменные), которые обязательны для "настоящих" объектно-ориентированных языков (например, Java, C++).

Кроме того, поддержка объектов в PHP недостаточно отработана и не очень эффективна. Это означает, что использование парадигмы ООП может существенно снизить скорость выполнения программы.

Примечание: Другими словами, скрипт, работающий на объектах будет исполняться медленнее, как код внутри eval() по сравнению с обычным кодом. Для более наглядных примеров, где использование ООП принимает какие-то уродливые формы, пришлось бы прибегнуть к продвинутым функциям концепциям PHP, некоторые из которых даже незадокументированы. Так что остановимся на этом.

А что же мы сможем без ООП?

Если вы пришли в PHP из Java или C++, где без объектов трудно создать что-либо более или менее серьёзное, то и в PHP вам будет трудно обходиться без них. Но будьте уверены, что серьёзные приложения могут быть написаны и методик и приёмов ООП (PHP был написан на C, а последний, как мы знаем, не поддерживает объектов).

Итак, для тех, кто не привык обходиться без ООП, приведём альтернативные технологии написания связных и расширяемых приложений вне парадигмы ООП:
Создание API.
Разработка концепции именования (и работа в её рамках).
Группирование взаимосвязанных функций в один файл.

Создание API

Соотнесём код программы с тремя уровнями:
Первый - собственно рабочие функции.
Второй - API функции. Сюда входят функции для построения конкретного приложения.
Третий - само приложение:

<?php 
// MortgageRate.php (Ипотечный Кредит) 

// Уровень первый - внутренние функции 
// Внутренние функции для расчёта оптимальной  процентной ставки исходя из времени и размера помесячных выплат 

function _mort_find_interest_rate ($total) { 
    if ($total < 30000) 
        return (7.4); 
    elseif ($total > 30000) 
        return (3.2); 
    elseif ($total > 50000) 
        return (2.5); 
    else 
        return (1.7); 
} 

// Уровень второй - API функции 

// double calculate_mortgage_rate (int money, int time, int month) 
// Рассчитывает процентную ставку исходя из суммы займа, времени погашения и интервала выплат 

function calculate_mortgage_rate ($money, $time, $month) { 
    $rate = _mort_find_interest_rate ($money) / 100; 
    $money /= ($time / $month); 
    return ($rate * $money) + $money; 
} 

?>
<?php 
// CalcMortgage.php 

// Третий уровень - приложение 
// $money, $time и $period получаем  из формы 

include_once 'MortgageRate.php'; 

$price = calculate_mortgage_rate ($money, $time, $period); 

print "Ваша процентная ставка за $period составляет $price"; 
?>

Разработка концепции именования и работа в её рамках.

Один из самых неприятных моментов при разработке больших приложений - это конфликты пространства имён. Классы его сегментируют. Таким образом, разные классы могут:
иметь свойства с одинаковыми именами или
содержать в себе методы с одинаковыми именами.
Например, класс Phillips и класс Normal могут одновременно содержать метод с именем screwdriver.

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

Группирование взаимосвязанных функций в один файл

Связанные API функции лучше всего собрать в один файл так же, как связанные методы объединяются в класс. Такие файлы можно представить классами, где каждая функция представляет собой как бы метод этого класса. Так, каждая функция будет иметь ясное определение и прозрачную структуру.

Например, можно было бы все функции, связанные с общением с БД, собрать в файл DB.php.

ООП, как и всё на свете, хорошо в меру

Небольшая оговорка: эта глава была написана не для того, чтобы отговорить вас от использования ООП вообще. Скорее, это была попытка убедить вас не работать с PHP в режиме Java или C++, где ООП - решение номер один.

Проведите тщательный анализ всех выгод и потерь, прежде чем применить объектный подход в PHP.