2024-08-17 18:11:11 +04:00
|
|
|
<?php
|
|
|
|
namespace nur\sery\wip\php\access;
|
|
|
|
|
|
|
|
/**
|
2024-08-17 21:34:05 +04:00
|
|
|
* Class ShadowAccess: accès en lecture depuis une instance de {@link IAccess}
|
2024-08-17 18:11:11 +04:00
|
|
|
* puis écriture dans une autre instance de {@link IAccess}
|
|
|
|
*
|
|
|
|
* l'objet est initialisé avec deux instances de {@link IAccess}: $reader et
|
|
|
|
* $writer
|
|
|
|
* - au départ, les méthodes de {@link IGetter} attaquent $reader et les
|
|
|
|
* méthodes de {@link ISetter} et {@link IDeleter} attaquent $writer
|
|
|
|
* - dès qu'une méthode de {@link ISetter} est utilisée, les méthodes de
|
|
|
|
* {@link IGetter} attaquent $writer
|
|
|
|
* - si une méthode de {@link IDeleter} est utilisée, les méthodes de
|
|
|
|
* {@link IGetter} attaquent de nouveau $reader comme initialement
|
|
|
|
*/
|
2024-08-17 21:34:05 +04:00
|
|
|
class ShadowAccess extends AbstractAccess {
|
2024-08-17 18:16:45 +04:00
|
|
|
function __construct(IAccess $reader, IAccess $writer) {
|
|
|
|
$this->reader = $reader;
|
|
|
|
$this->writer = $writer;
|
|
|
|
$this->getter = $reader;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected IAccess $reader;
|
|
|
|
|
|
|
|
protected IAccess $writer;
|
|
|
|
|
|
|
|
protected IGetter $getter;
|
|
|
|
|
|
|
|
function exists(): bool {
|
|
|
|
return $this->getter->exists();
|
|
|
|
}
|
|
|
|
|
|
|
|
function available(): bool {
|
|
|
|
return $this->getter->available();
|
|
|
|
}
|
|
|
|
|
|
|
|
function get($default=null) {
|
|
|
|
return $this->getter->get($default);
|
|
|
|
}
|
|
|
|
|
|
|
|
function set($value): void {
|
|
|
|
$this->writer->set($value);
|
|
|
|
$this->getter = $this->writer;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function del(): void {
|
|
|
|
$this->writer->del();
|
|
|
|
$this->getter = $this->reader;
|
|
|
|
}
|
2024-08-17 18:11:11 +04:00
|
|
|
}
|