<?php
class CookieStorage {
public function addCookie(Cookie $cookie): void {
$encodedCookieValue = $this->encodeCookie($cookie->value);
setcookie(
$cookie->name,
$encodedCookieValue,
$cookie->options
);
$_COOKIE[$cookie->name] = $encodedCookieValue;
}
public function getCookie(string $cookieName): ?Cookie {
$encodedCookieValue = $_COOKIE[$cookieName] ?? null;
if (null === $encodedCookieValue) {
return null;
}
$cookieValue = $this->decodeCookie($encodedCookieValue);
return new Cookie($cookieName, $cookieValue);
}
private function encodeCookie(mixed $value): string {
return json_encode($value);
}
private function decodeCookie(string $value): mixed {
return json_decode($value);
}
}
class Cookie {
readonly public string $name;
readonly public mixed $value;
readonly public array $options;
public function __construct(string $name, mixed $value, array $options = [])
{
$this->name = $name;
$this->value = $value;
if ([] === $options) {
$options = [
'expires' => time() + 60 * 60 * 24 * 30,
'secure' => true,
'httponly' => true,
];
}
$this->options = $options;
}
}
$storage = new CookieStorage();
$cookie = new Cookie('test', ['one', 'two']);
$storage->addCookie($cookie);
var_dump($storage->getCookie('test'));
preferences:
25.26 ms | 408 KiB | 5 Q