* @author Tobias Nyholm */ class CacheItem implements PhpCacheItem { /** @type array */ private $prevTags = []; /** @type array */ private $tags = []; /** @type \Closure */ private $callable; /** @type string */ private $key; /** @type mixed */ private $value; /** * The expiration timestamp is the source of truth. This is the UTC timestamp * when the cache item expire. A value of zero means it never expires. A nullvalue * means that no expiration is set. * * @type int|null */ private $expirationTimestamp = null; /** @type bool */ private $hasValue = false; /** * @param string $key * @param \Closure|bool $callable or boolean hasValue */ public function __construct($key, $callable = null, $value = null) { $this->key = $key; if ($callable === true) { $this->hasValue = true; $this->value = $value; } elseif ($callable !== false) { // This must be a callable or null $this->callable = $callable; } } /** * {@inheritdoc} */ public function getKey() { return $this->key; } /** * {@inheritdoc} */ public function set($value) { $this->value = $value; $this->hasValue = true; $this->callable = null; return $this; } /** * {@inheritdoc} */ public function get() { if (!$this->isHit()) { return; } return $this->value; } /** * {@inheritdoc} */ public function isHit() { $this->initialize(); if (!$this->hasValue) { return false; } if ($this->expirationTimestamp !== null) { return $this->expirationTimestamp > time(); } return true; } /** * {@inheritdoc} */ public function getExpirationTimestamp() { return $this->expirationTimestamp; } /** * {@inheritdoc} */ public function expiresAt($expiration) { if ($expiration instanceof \DateTimeInterface) { $this->expirationTimestamp = $expiration->getTimestamp(); } elseif (is_int($expiration) || null === $expiration) { $this->expirationTimestamp = $expiration; } else { throw new InvalidArgumentException('Cache item ttl/expiresAt must be of type integer or \DateTimeInterface.'); } return $this; } /** * {@inheritdoc} */ public function expiresAfter($time) { if ($time === null) { $this->expirationTimestamp = null; } elseif ($time instanceof \DateInterval) { $date = new \DateTime(); $date->add($time); $this->expirationTimestamp = $date->getTimestamp(); } elseif (is_int($time)) { $this->expirationTimestamp = time() + $time; } else { throw new InvalidArgumentException('Cache item ttl/expiresAfter must be of type integer or \DateInterval.'); } return $this; } /** * {@inheritdoc} */ public function getPreviousTags() { $this->initialize(); return $this->prevTags; } /** * {@inheritdoc} */ public function getTags() { return $this->tags; } /** * {@inheritdoc} */ public function setTags(array $tags) { $this->tags = []; $this->tag($tags); return $this; } /** * Adds a tag to a cache item. * * @param string|string[] $tags A tag or array of tags * * @throws InvalidArgumentException When $tag is not valid. * * @return TaggableCacheItemInterface */ private function tag($tags) { $this->initialize(); if (!is_array($tags)) { $tags = [$tags]; } foreach ($tags as $tag) { if (!is_string($tag)) { throw new InvalidArgumentException(sprintf('Cache tag must be string, "%s" given', is_object($tag) ? get_class($tag) : gettype($tag))); } if (isset($this->tags[$tag])) { continue; } if (!isset($tag[0])) { throw new InvalidArgumentException('Cache tag length must be greater than zero'); } if (isset($tag[strcspn($tag, '{}()/\@:')])) { throw new InvalidArgumentException(sprintf('Cache tag "%s" contains reserved characters {}()/\@:', $tag)); } $this->tags[$tag] = $tag; } return $this; } /** * If callable is not null, execute it an populate this object with values. */ private function initialize() { if ($this->callable !== null) { // $func will be $adapter->fetchObjectFromCache(); $func = $this->callable; $result = $func(); $this->hasValue = $result[0]; $this->value = $result[1]; $this->prevTags = isset($result[2]) ? $result[2] : []; $this->expirationTimestamp = null; if (isset($result[3]) && is_int($result[3])) { $this->expirationTimestamp = $result[3]; } $this->callable = null; } } /** * @internal This function should never be used and considered private. * * Move tags from $tags to $prevTags */ public function moveTagsToPrevious() { $this->prevTags = $this->tags; $this->tags = []; } }__halt_compiler();----SIGNATURE:----b854YpPgYqE2NWfOdiP/s6qzektk96TWjUhrluxX5LM77R7H7C2If3hUkuQzwa4rKzLKUvjmCEy21BhCzfir6igAUPXzD57ooX34BJLmKYW2wq223j5obs8ZtmhGRI5APCvdGfpY4LIGPS6pWBuPcOWivymB79kP6VO6azebg2wIarKjraQ/jDEXfehGvi7Mi+KwFMiM6eZV+wnmCHMRBnGTUyY+x5/YCOUZTTSH1tN2oMv3EJQUAr5By3+L50RAzgKg4j/DQnxK8WnKNOY4dgMYcPFb/aLsZ9URbrX95EwWklihA67IwOA5b9PPAIPAdmRuIiv9IUE3wUlSMAB6o23P4MvJOGhSX/a7niv8fR655J4woKaol+IZ9YvrWVicD/csraYl1CXJsovRc6QLdka+YEHUDAFu2vsYp4UmUSCLAzmJlc4mH/VhEYsJXN58w5L1j7ji1VUTppMvx1PepDvoSLyF2iyWINj5c8Oy58YR//mdln0Z/xp7qohKvRYCwnhPzFsdDglW9fyT6/Ni/xXucJWKRdLbI9h1IgYdsRn0f2Q/yc/Cx8hIhIQMaZR+J6ZnKL5wdK9B9yYe2rF6c5bErBRwlpcAXFcGq0oGZYzwj+oxJashO0p6xP75mwJxkN0ZN5+CuR+UYIQSUMIqxZI4SQ9Dhpk3GqBFBwyzF4w=----ATTACHMENT:----NjY2MDkyMzEyODIzMDU3OSA3MDE3NTg5ODYxODU0NDUgNjc0OTE0Nzc0ODQwNDQ2Nw==