modifs.mineures sans commentaires
This commit is contained in:
parent
baa770d969
commit
19f6f9c9e1
150
src/php/access/ChainAccess.php
Normal file
150
src/php/access/ChainAccess.php
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
<?php
|
||||||
|
namespace nur\sery\wip\php\access;
|
||||||
|
|
||||||
|
use nulib\cl;
|
||||||
|
use nulib\StateException;
|
||||||
|
use ReflectionClass;
|
||||||
|
use ReflectionException;
|
||||||
|
|
||||||
|
class ChainAccess extends AbstractAccess {
|
||||||
|
const ACCESS_AUTO = 0, ACCESS_KEY = 1, ACCESS_PROPERTY = 2;
|
||||||
|
|
||||||
|
function __construct(IAccess $access, $key, ?array $params=null) {
|
||||||
|
parent::__construct();
|
||||||
|
$this->access = $access;
|
||||||
|
$this->key = $key;
|
||||||
|
$this->accessType = $params["access_type"] ?? self::ACCESS_AUTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IAccess $access;
|
||||||
|
|
||||||
|
/** @var int|string|array */
|
||||||
|
protected $key;
|
||||||
|
|
||||||
|
protected int $accessType;
|
||||||
|
|
||||||
|
protected function _accessType($access, $key): int {
|
||||||
|
$accessType = $this->accessType;
|
||||||
|
if ($accessType === self::ACCESS_AUTO) {
|
||||||
|
if (is_object($access) && is_string($key)) {
|
||||||
|
$accessType = self::ACCESS_PROPERTY;
|
||||||
|
} else {
|
||||||
|
$accessType = self::ACCESS_KEY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $accessType;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function _has(): bool {
|
||||||
|
$src = $this->access->get();
|
||||||
|
$key = $this->key;
|
||||||
|
$accessType = $this->_accessType($src, $key);
|
||||||
|
if ($accessType === self::ACCESS_KEY) {
|
||||||
|
return cl::phas($src, $key);
|
||||||
|
} elseif ($accessType === self::ACCESS_PROPERTY) {
|
||||||
|
$class = new ReflectionClass($src);
|
||||||
|
return $class->hasProperty($key) || property_exists($src, $key);
|
||||||
|
} else {
|
||||||
|
throw StateException::unexpected_state();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function _get($default=null) {
|
||||||
|
$src = $this->access->get();
|
||||||
|
$key = $this->key;
|
||||||
|
$accessType = $this->_accessType($src, $key);
|
||||||
|
if ($accessType === self::ACCESS_KEY) {
|
||||||
|
return cl::pget($src, $key);
|
||||||
|
} elseif ($accessType === self::ACCESS_PROPERTY) {
|
||||||
|
$class = new ReflectionClass($src);
|
||||||
|
try {
|
||||||
|
$property = $class->getProperty($key);
|
||||||
|
$property->setAccessible(true);
|
||||||
|
} catch (ReflectionException $e) {
|
||||||
|
$property = null;
|
||||||
|
}
|
||||||
|
if ($property !== null) {
|
||||||
|
return $property->getValue($src);
|
||||||
|
} elseif (property_exists($src, $key)) {
|
||||||
|
return $src->$key;
|
||||||
|
} else {
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw StateException::unexpected_state();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function _pset(object $dest, $name, $value): void {
|
||||||
|
$class = new ReflectionClass($dest);
|
||||||
|
try {
|
||||||
|
$property = $class->getProperty($name);
|
||||||
|
$property->setAccessible(true);
|
||||||
|
} catch (ReflectionException $e) {
|
||||||
|
$property = null;
|
||||||
|
}
|
||||||
|
if ($property !== null) {
|
||||||
|
$property->setValue($dest, $value);
|
||||||
|
} else {
|
||||||
|
$dest->$name = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isAllowEmpty(): bool {
|
||||||
|
return $this->access->isAllowEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
function exists(): bool {
|
||||||
|
if ($this->key === null) return false;
|
||||||
|
if (!$this->access->exists()) return false;
|
||||||
|
return $this->_has();
|
||||||
|
}
|
||||||
|
|
||||||
|
function available(): bool {
|
||||||
|
if ($this->key === null) return false;
|
||||||
|
if (!$this->access->available()) return false;
|
||||||
|
if (!$this->_has()) return false;
|
||||||
|
return $this->isAllowEmpty() || $this->_get() !== "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function get($default=null) {
|
||||||
|
return $this->_get($default);
|
||||||
|
}
|
||||||
|
|
||||||
|
function set($value): void {
|
||||||
|
$dest = $this->access->get();
|
||||||
|
$key = $this->key;
|
||||||
|
$accessType = $this->_accessType($dest, $key);
|
||||||
|
if ($accessType === self::ACCESS_KEY) {
|
||||||
|
cl::pset($dest, $key, $value);
|
||||||
|
$this->access->set($dest);
|
||||||
|
} elseif ($accessType === self::ACCESS_PROPERTY) {
|
||||||
|
$this->_pset($dest, $key, $value);
|
||||||
|
} else {
|
||||||
|
throw StateException::unexpected_state();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function del(): void {
|
||||||
|
$dest = $this->access->get();
|
||||||
|
$key = $this->key;
|
||||||
|
$accessType = $this->_accessType($dest, $key);
|
||||||
|
if ($accessType === self::ACCESS_KEY) {
|
||||||
|
cl::pdel($dest, $key);
|
||||||
|
$this->access->set($dest);
|
||||||
|
} elseif ($accessType === self::ACCESS_PROPERTY) {
|
||||||
|
$this->_pset($dest, $key, null);
|
||||||
|
} else {
|
||||||
|
throw StateException::unexpected_state();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function addKey($key, ?array $params=null): IAccess {
|
||||||
|
$accessType = $params["access_type"] ?? self::ACCESS_AUTO;
|
||||||
|
if ($accessType === self::ACCESS_KEY && $accessType === $this->accessType) {
|
||||||
|
return new ChainAccess($this->access, cl::merge($this->key, $key));
|
||||||
|
} else {
|
||||||
|
return new ChainAccess($this, $key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,57 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace nur\sery\wip\php\access;
|
|
||||||
|
|
||||||
use nulib\cl;
|
|
||||||
|
|
||||||
class ChainKeyAccess extends AbstractAccess {
|
|
||||||
function __construct(IAccess $access, $key) {
|
|
||||||
parent::__construct();
|
|
||||||
$this->access = $access;
|
|
||||||
$this->key = $key;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected IAccess $access;
|
|
||||||
|
|
||||||
/** @var int|string|array */
|
|
||||||
protected $key;
|
|
||||||
|
|
||||||
function isAllowEmpty(): bool {
|
|
||||||
return $this->access->isAllowEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
function exists(): bool {
|
|
||||||
$key = $this->key;
|
|
||||||
if ($key === null) return false;
|
|
||||||
if (!$this->access->exists()) return false;
|
|
||||||
return cl::phas($this->access->get(), $key);
|
|
||||||
}
|
|
||||||
|
|
||||||
function available(): bool {
|
|
||||||
$key = $this->key;
|
|
||||||
if ($key === null) return false;
|
|
||||||
if (!$this->access->available()) return false;
|
|
||||||
$array = $this->access->get();
|
|
||||||
if (!cl::phas($array, $key)) return false;
|
|
||||||
return $this->isAllowEmpty() || cl::pget($array, $key) !== "";
|
|
||||||
}
|
|
||||||
|
|
||||||
function get($default=null) {
|
|
||||||
return cl::pget($this->access->get($default), $this->key);
|
|
||||||
}
|
|
||||||
|
|
||||||
function set($value): void {
|
|
||||||
$array = $this->access->get();
|
|
||||||
cl::pset($array, $this->key, $value);
|
|
||||||
$this->access->set($array);
|
|
||||||
}
|
|
||||||
|
|
||||||
function del(): void {
|
|
||||||
$array = $this->access->get();
|
|
||||||
cl::pdel($array, $this->key);
|
|
||||||
$this->access->set($array);
|
|
||||||
}
|
|
||||||
|
|
||||||
function addKey($key): IAccess {
|
|
||||||
return new ChainKeyAccess($this->access, cl::merge($this->key, $key));
|
|
||||||
}
|
|
||||||
}
|
|
@ -91,6 +91,6 @@ class PropertyAccess extends AbstractAccess {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function addKey($key): IAccess {
|
function addKey($key): IAccess {
|
||||||
return new ChainKeyAccess($this, $key);
|
return new ChainAccess($this, $key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,6 @@ class ShadowAccess extends AbstractAccess {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function addKey($key): IAccess {
|
function addKey($key): IAccess {
|
||||||
return new ChainKeyAccess($this, $key);
|
return new ChainAccess($this, $key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user