Урок 4: Оптимизация кода путем добавления классов и объектов
В этом уроке рассматриваются способы оптимизации кода, позволяющие упростить поддержку этого кода в дальнейшем. Данная процедура затрагивает файлы createNewWisher.php и wishlist.php . Кроме того, создается новый файл под названием db.php .
Код приложения содержит несколько похожих блоков с запросами к базе данных. Для упрощения чтения и поддержки кода в будущем можно извлечь эти блоки, реализовать их в качестве функций отдельного класса WishDB и поместить текст WishDB в файл db.php . Впоследствии можно включить файл db.php в любой файл PHP и использовать любую функцию класса WishDB без дублирования кода. Такой подход гарантирует, что любые изменения в запросах или функциях будут выполнены в одном местоположении, и анализировать весь код приложения не потребуется.
При использовании функции класса WishDB не следует изменять значения каких-либо переменных в классе WishDB. Вместо этого необходимо использовать класс в качестве концептуального проекта для создания объекта WishDB и изменять значения переменных в этом объекте. Объект уничтожается при завершении работы. Поскольку значения непосредственно класса WishDB никогда не изменяются, данный класс можно использовать повторно неограниченное число раз. В некоторых случаях может потребоваться одновременно несколько экземпляров класса, а в других случаях будет предпочтителен "одноэкземплярный" класс, имеющий только один экземпляр в любой момент времени. WishDB в данном руководстве представлен как одноэкземплярный класс.
Следует отметить, что создание объекта класса обозначается термином "создание экземпляра" этого класса и что объект в данном случае называется "экземпляром" класса. Общий термин, обозначающий программирование с использованием классов и объектов, – "объектно-ориентированное программирование" (ООП). В PHP 5 используется сложная модель ООП. См. php.net для получения дополнительной информации.
В данном руководстве вы перемещаете функциональность вызова базы данных из отдельных файлов РНР в класс WishDB. Пользователи MySQL также заменяют процедурные вызовы mysqli объектно-ориентированными. Это соответствует новой объектно-ориентированной структуре приложения.
Текущий документ является частью краткого учебного курса "Создание приложения CRUD в IDE NetBeans для PHP".
Исходный код приложения из предыдущего урока
Для пользователей MySQL: перейдите по этой ссылке для загрузки исходного кода, описывающего состояние проекта на момент завершения предыдущего урока.
Для пользователей Oracle Database: щелкните здесь для загрузки исходного кода, отражающего состояние проекта по завершении предыдущего урока.
Создание файла db.php
Создайте новую подпапку в папке "Исходные файлы". Дайте папке имя Includes. Создайте новый файл под именем db.php и поместите его в папку Includes. Позже вы сможете добавлять в эту папку файлы, которые будут включаться в другие РНР-файлы.
Чтобы создать файл db.php в новой папке, сделайте следующее:
Щелкните правой кнопкой мыши узел "Source Files" и выберите "New > Folder" в контекстном меню. Откроется диалоговое окно "Новая папка"
В поле "Имя папки" введите Includes. Затем нажмите кнопку "Готово".
Щелкните правой кнопкой мыши узел "Includes" и выберите "New > PHP File" в контекстном меню. Откроется диалоговое окно "Новый файл РНР".
В поле "Имя файла" введите db. Затем нажмите кнопку "Готово".
Создание класса WishDB
Для создания класса WishDB необходимо инициализировать переменные класса и реализовать конструктор класса. Пользователи MySQL, обратите внимание, что класс WishDB расширяет mysqli . Это означает, что WishDB наследует функции и другие характеристики класса PHP mysqli. Вы убедитесь в важности этого при добавлении функций mysqli к классу.
Откройте файл db.php и создайте класс WishDB. В данном классе объявите переменные настройки базы данных для хранения имени и пароля собственника базы данных (пользователя), имени и машины размещения базы данных. Все объявления переменных являются закрытыми: это означает, что начальные значения в этих объявлениях недоступны вне класса WishDB (см. php.net). Вы также объявляете закрытую _ статическую переменную_ $instance , которая хранит экземпляр WishDB. Ключевое слово "статический" означает, что функции в классе имеют доступ к переменной даже при отсутствии экземпляра класса.
Для базы данных MySQL:
Для базы данных Oracle:
Создание экземпляров класса WishDB
При использовании функций класса WishDB в других файлах PHP должна быть вызвана функция, позволяющая создать объект ("создать экземпляр") класса WishDB. WishDB разработан в качестве одноэкземплярного класса; это означает, что в любой определенный момент времени может существовать только один экземпляр класса. Поэтому рекомендуется предотвращать создание экземпляра WishDB, которое осуществляется извне и способствует появлению дублирующихся экземпляров.
Внутри класса WishDB введите или вставьте следующий код:
Функция getInstance является общедоступной и статической. Общедоступность означает возможность свободного доступа извне класса. Статическая функция доступна даже в том случае, если для класса не было создано экземпляров. Поскольку функция getInstance вызывается для создания экземпляров класса, она является статической. Обратите внимание, что эта функция имеет доступ к статической переменной $instance и устанавливает ее значение как экземпляр класса.
Двойное двоеточие (::), или "оператор разрешения диапазона" (Scope Resolution Operator), и ключевое слово self используются для получения доступа к статическим функциям. Self в рамках определения класса используется в качестве ссылки на данный класс. Если двойное двоеточие находится вне определения класса, вместо self используется имя класса. См. ресурс php.net для получения информации об операции разрешения диапазона.
Добавление конструктора к классу WishDB
Класс может содержать в себе специальный метод, известный как "конструктор", который выполняется автоматически каждый раз при создании экземпляра этого класса. В данном руководстве рассматривается добавление к классу WishDB конструктора, который подключается к базе данных каждый раз при создании экземпляра WishDB.