Кто может дать комментарии по поводу кода 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
254 +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 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир