76 lines
2.6 KiB
PHP
76 lines
2.6 KiB
PHP
<?php
|
|
namespace nur\b\coll;
|
|
|
|
use nur\A;
|
|
use nur\data\types\Metadata;
|
|
|
|
/**
|
|
* Class FancyArray: une implémentation de array avec support d'un schéma et de
|
|
* méthodes automatiques
|
|
*/
|
|
abstract class FancyArray extends IterableArray {
|
|
use TAutomethods;
|
|
|
|
const _AUTO_GETTERS = null;
|
|
const _AUTO_SETTERS = null;
|
|
const _AUTO_DELETERS = null;
|
|
const _AUTO_CI_GETTERS = null;
|
|
const _AUTO_CI_SETTERS = null;
|
|
|
|
/** @var array */
|
|
const SCHEMA = null;
|
|
|
|
/**
|
|
* retourner le gestionnaire de schéma. la façon la plus simple est d'utiliser
|
|
* le trait {@link TArrayMd} qui maintient un cache partagé entre toutes les
|
|
* instances de cette classe.
|
|
*/
|
|
protected function md(): ?Metadata {
|
|
$schema = static::SCHEMA;
|
|
if ($schema === null) return null;
|
|
else return new Metadata($schema);
|
|
}
|
|
|
|
/**
|
|
* le cas échéant, s'assurer que $data est conforme au schéma. cette méthode
|
|
* est prévue pour être appelée dans le constructeur. la façon la plus simple
|
|
* est d'utiliser le trait {@link TArrayMd} qui maintient un cache partagé entre
|
|
* toutes les instances de cette classe.
|
|
*
|
|
* @param mixed $key le cas échéant, clé associée à $data si cette valeur
|
|
* provient d'un tableau.
|
|
*/
|
|
protected function ensureData($data, $key=null): array {
|
|
$md = $this->md();
|
|
if ($md !== null) $md->ensureSchema($data, $key);
|
|
else A::ensure_array($data);
|
|
return $data;
|
|
}
|
|
|
|
function __construct($data=null, $key=null) {
|
|
parent::__construct($this->ensureData($data, $key));
|
|
}
|
|
|
|
# Modèle d'implémentation dans une classe dérivée:
|
|
## ArrayAccess
|
|
#function has(KeyType $key): bool { return $this->_has($key); }
|
|
#function &get(KeyType $key, ?ValueType $default=null): ?ValueType { return $this->_get($key, $default); }
|
|
#function set(KeyType $key, ?ValueType $value): self { return $this->_set($key, $value); }
|
|
#function add(?ValueType $value): self { return $this->_set(null, $value); }
|
|
#function del(KeyType $key): self { return $this->_del($key); }
|
|
## Iterator
|
|
#function key(): KeyType { return $this->_key(); }
|
|
#function current(): ?ValueType { return $this->_current(); }
|
|
|
|
# Par exemple, pour un array générique, on aurait:
|
|
## ArrayAccess
|
|
#function has($key): bool { return $this->_has($key); }
|
|
#function &get($key, $default=null) { return $this->_get($key, $default); }
|
|
#function set($key, $value): self { return $this->_set($key, $value); }
|
|
#function add($value): self { return $this->_set(null, $value); }
|
|
#function del($key): self { return $this->_del($key); }
|
|
## Iterator
|
|
#function key() { return $this->_key(); }
|
|
#function current() { return $this->_current(); }
|
|
}
|