У меня было задание, я его выполнил. Но мне нужно внести исправления. Я с ними не могу справится.
Изменения:
"При сохранении данных необходимо учитывать ключи новых данных и тех данных что хранятся в базе(файле), если значение с ключом в базе(файле) уже существует, то нужно его значение заменить на новое."
- "Классы FileBox и DbBox должен быть реализованы таким образом, чтобы нельзя было создать более одного экземпляра каждого из классов."
<?php
interface Box
{
public function setData($key, $value);
public function getData($key);
public function save();
public function load();
}
abstract class BoxAbstract implements Box
{
protected $data = [];
public function setData($key, $value)
{
$this->data[$key] = $value;
}
public function getData($key)
{
return $this->data[$key] ?? null;
}
public abstract function save();
public abstract function load();
}
class FileBox extends BoxAbstract
{
private $file;
public function __construct($file)
{
$this->file = $file;
}
public function save()
{
file_put_contents($this->file, serialize($this->data));
}
public function load()
{
$this->data = unserialize(file_get_contents($this->file));
}
}
class DbBox extends BoxAbstract
{
private $pdo;
public function __construct(\PDO $pdo)
{
$this->pdo = $pdo;
}
public function save()
{
$this->pdo->beginTransaction();
$this->pdo->query('DELETE FROM box')->execute();
$stmt = $this->pdo->prepare("INSERT INTO box (key, value) VALUES (:key, :value)");
foreach ($this->data as $key => $value) {
$stmt->bindValue(':key', $key);
$stmt->bindValue(':value', serialize($value));
$stmt->execute();
}
$this->pdo->commit();
}
public function load()
{
$stmt = $this->pdo->query('SELECT key, value FROM box_items');
$data = [];
while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
$data[$row['key']] = unserialize($row['value']);
}
$this->data = $data;
}
}