Кто может дать комментарии по поводу кода PHP ООП (Code review)? Здравствуйте!
Написал Singleton класс на PHP - необходим человек, который даст свои комментарии по поводу кода. Пытаюсь писать "чистый код". Логика кода работает как надо.
Не совсем уверен в следующих вещах:Реализация соединения с БДИсключенияРеализация синглтона... что-то еще
Сам код:getMessage());
}
return $pdo;
}
/**
* @param $id
* @return mixed
*/
private static function getFromDb($id){
$sql = "SELECT `data` FROM tree2 WHERE id = ? LIMIT 1";
$stmt = self::$pdo->prepare($sql);
$stmt->execute(array($id));
$row = $stmt->fetch(PDO::FETCH_LAZY);
return $row;
}
/**
* Сохранение в БД.
*/
private static function saveToDb() {
$sql = "UPDATE tree2 SET `data` = :data WHERE id = :id";
$stmt = self::$pdo->prepare($sql);
$stmt->execute(array(':id' => self::$id, ':data' => self::mySerialize(self::$data)));
}
/**
* treeData constructor.
* @param $id
* @throws Exception
*/
private function __construct($id) {
if(!is_int($id)){
throw new Exception("ИД пользователя должно быть целым числом.");
}
self::$pdo = self::db();
self::$id = $id;
$row = self::getFromDb($id);
$data = $row['data'];
//Подготовка данных
if(empty($data)){ //Массив пуст, создаем новый
self::$data = array();
} else{ //Работаем с данными
self::$data = self::myDeserialize($data);
}
}
/**
* Для предотвращения возможного клонирования объекта
*/
private function __clone() { //запрещаем клонирование объекта модификатором private
}
/**
* Статическая функция для сериализации масива
* @param $data
* @return string
*/
private static function mySerialize($data){
return json_encode(serialize($data));
}
/**
* Статическая функция для десиарилизации массива
* @param $data
* @return mixed
*/
private static function myDeserialize($data){
return unserialize(json_decode($data));
}
/**
* Обеспечивает возможность получения конкретной переменной из приватной переменной data
* @param String $path
* @return array
* @throws Exception
*/
public static function get($path){
$pathArray = explode('/', $path); //Получаю массив с путем
$level = self::$data; //Начальный массив
foreach ($pathArray as $key){
if(array_key_exists($key, $level)){
$level = $level[$key];
} else {
throw new Exception("Индекса '$key' не существует");
}
}
return $level;
}
/**
* беспечивает возможность установки новой или замещения текущей переменной.
* @param $path
* @param $value
*/
public static function set($path, $value){
//Получаем путь
$pathArray = explode('/', $path);
//Вносим в массив данные
$level =& self::$data;
foreach ($pathArray as $key) {
if (!array_key_exists($key, $level) or !is_array($level[$key])) {
$level[$key] = [];
}
$level =& $level[$key];
}
if(is_array($level) && is_array($value)){
$level = array_merge($level, $value);
} else {
$level = $value;
}
//Запись в БД
self::saveToDb();
}
}
try{
$z = treeData::getInstance(1);
//$z::set("1/3/4", array('test1', 'test2'));
$z::set("1/3/4", array('test3'));
//$z::set("1", array("main_thread" => "main"));
var_dump($z::get("1"));
}
catch (Exception $e){
echo $e->getMessage();
}

21 Авг 2019 в 07:01
238 +1
0
Ответы
1

Реализация соединения с БД:

При создании экземпляра класса в методе __construct, вы вызываете метод db() для установления соединения с БД и сохранения этого соединения в статической переменной $pdo. Это может быть излишне, так как соединение с БД лучше открывать только при необходимости, например, когда выполняется какой-то запрос.Здесь можно использовать lazy loading для соединения с БД, то есть соединение устанавливается только тогда, когда это действительно нужно.

Обработка исключений:

В целом, обработка исключений в вашем коде вполне адекватна. Однако, при выбрасывании исключения в методе getInstance о повторном создании экземпляра, может быть полезно добавить логирование этой ошибки, чтобы понять, почему это произошло.

Реализация синглтона:

Реализация синглтона в целом корректна, хотя в данном случае можно обойтись без использования синглтона, так как его применение приводит к глобальной доступности этого объекта и усложняет тестирование.

Другие замечания:

Метод mySerialize - необходимо возвращать только результат serialize($data), без использования json_encode.Метод myDeserialize - необходимо исправить на unserialize(json_encode($data)).В методе getFromDb, рекомендуется проверять наличие выполняемого запроса и наличие соединения с БД.В методе set, лучше использовать подготовленные запросы для защиты от SQL инъекций при сохранении данных в БД.Советы:

Пересмотрите необходимость использования синглтона в данной ситуации и возможно будет лучше использовать другой паттерн.

Пересмотрите логику соединения с БД и обработки данных, чтобы он был более оптимизированным и безопасным.

Объедините логику методов getFromDb и saveToDb для лучшей читаемости и управления кодом.

Не забудьте использовать подготовленные запросы для безопасного выполнения SQL запросов.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 95 047 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир