https://www.phpfastcache.com * @author Georges.L (Geolim4) * */ declare(strict_types=1); namespace Phpfastcache\Config; use Phpfastcache\Exceptions\PhpfastcacheInvalidConfigurationException; use Phpfastcache\Util\ArrayObject; use ReflectionException; use ReflectionMethod; use ReflectionParameter; use TypeError; /** * Class ConfigurationOption * @package Phpfastcache\Config */ class ConfigurationOption extends ArrayObject implements ConfigurationOptionInterface { /** * @var bool */ protected $itemDetailedDate = false; /** * @var bool */ protected $autoTmpFallback = false; /** * @var int */ protected $defaultTtl = 900; /** * @var string|Callable */ protected $defaultKeyHashFunction = 'md5'; /** * @var string|Callable */ protected $defaultFileNameHashFunction = 'md5'; /** * @var int */ protected $defaultChmod = 0777; /** * @var string */ protected $path = ''; /** * @var int */ protected $limitedMemoryByObject = 4096; /** * @var bool */ protected $compressData = false; /** * @var bool */ protected $preventCacheSlams = false; /** * @var int */ protected $cacheSlamsTimeout = 15; /** * @var bool */ protected $useStaticItemCaching = true; /** * @param $args * ArrayObject constructor. * @throws PhpfastcacheInvalidConfigurationException * @throws ReflectionException */ public function __construct(...$args) { parent::__construct(...$args); $array =& $this->getArray(); /** * Detect unwanted keys and throw an exception. * No more kidding now, it's 21th century. */ if (\array_diff_key($array, \get_object_vars($this))) { throw new PhpfastcacheInvalidConfigurationException( sprintf( 'Invalid option(s) for the config %s: %s', static::class, \implode(', ', \array_keys(\array_diff_key($array, \get_object_vars($this)))) ) ); } foreach (\get_object_vars($this) as $property => $value) { if (\array_key_exists($property, $array)) { $this->$property = &$array[$property]; } else { $array[$property] = &$this->$property; } } foreach (\get_class_methods($this) as $method) { if (\strpos($method, 'set') === 0) { $value = null; try { /** * We use property instead of getter * because of is/get conditions and * to allow us to retrieve the value * in catch statement bloc */ $value = $this->{\lcfirst(\substr($method, 3))}; $this->{$method}($value); } catch (TypeError $e) { $typeHintGot = \is_object($value) ? \get_class($value) : \gettype($value); $reflectionMethod = new ReflectionMethod($this, $method); $parameter = $reflectionMethod->getParameters()[0] ?? null; $typeHintExpected = ($parameter instanceof ReflectionParameter ? ($parameter->getType()->getName() === 'object' ? $parameter->getClass() : $parameter->getType( )->getName()) : 'Unknown type'); throw new PhpfastcacheInvalidConfigurationException( \sprintf( 'Invalid type hint found for "%s", expected "%s" got "%s"', \lcfirst(\substr($method, 3)), $typeHintExpected, $typeHintGot ) ); } } } } /** * @param string $optionName * @return mixed|null */ public function isValidOption(string $optionName) { return property_exists($this, $optionName); } /** * @return bool */ public function isItemDetailedDate(): bool { return $this->itemDetailedDate; } /** * @param bool $itemDetailedDate * @return ConfigurationOption */ public function setItemDetailedDate(bool $itemDetailedDate): self { $this->itemDetailedDate = $itemDetailedDate; return $this; } /** * @return bool */ public function isAutoTmpFallback(): bool { return $this->autoTmpFallback; } /** * @param bool $autoTmpFallback * @return ConfigurationOption */ public function setAutoTmpFallback(bool $autoTmpFallback): self { $this->autoTmpFallback = $autoTmpFallback; return $this; } /** * @return int */ public function getDefaultTtl(): int { return $this->defaultTtl; } /** * @param int $defaultTtl * @return ConfigurationOption */ public function setDefaultTtl(int $defaultTtl): self { $this->defaultTtl = $defaultTtl; return $this; } /** * @return Callable|string */ public function getDefaultKeyHashFunction() { return $this->defaultKeyHashFunction; } /** * @param Callable|string $defaultKeyHashFunction * @return ConfigurationOption * @throws PhpfastcacheInvalidConfigurationException */ public function setDefaultKeyHashFunction($defaultKeyHashFunction): self { if ($defaultKeyHashFunction && !\is_callable($defaultKeyHashFunction) && (\is_string($defaultKeyHashFunction) && !\function_exists($defaultKeyHashFunction))) { throw new PhpfastcacheInvalidConfigurationException('defaultKeyHashFunction must be a valid function name string'); } $this->defaultKeyHashFunction = $defaultKeyHashFunction; return $this; } /** * @return Callable|string */ public function getDefaultFileNameHashFunction() { return $this->defaultFileNameHashFunction; } /** * @param Callable|string $defaultFileNameHashFunction * @return ConfigurationOption * @throws PhpfastcacheInvalidConfigurationException */ public function setDefaultFileNameHashFunction($defaultFileNameHashFunction): self { if (!\is_callable($defaultFileNameHashFunction) && (\is_string($defaultFileNameHashFunction) && !\function_exists($defaultFileNameHashFunction))) { throw new PhpfastcacheInvalidConfigurationException('defaultFileNameHashFunction must be a valid function name string'); } $this->defaultFileNameHashFunction = $defaultFileNameHashFunction; return $this; } /** * @return int */ public function getDefaultChmod(): int { return $this->defaultChmod; } /** * @param int $defaultChmod * @return ConfigurationOption */ public function setDefaultChmod(int $defaultChmod): self { $this->defaultChmod = $defaultChmod; return $this; } /** * @return string */ public function getPath(): string { return $this->path; } /** * @param string $path * @return ConfigurationOption */ public function setPath(string $path): self { $this->path = $path; return $this; } /** * @return int */ public function getLimitedMemoryByObject(): int { return $this->limitedMemoryByObject; } /** * @param int $limitedMemoryByObject * @return ConfigurationOption */ public function setLimitedMemoryByObject(int $limitedMemoryByObject): self { $this->limitedMemoryByObject = $limitedMemoryByObject; return $this; } /** * @return bool */ public function isCompressData(): bool { return $this->compressData; } /** * @param bool $compressData * @return ConfigurationOption */ public function setCompressData(bool $compressData): self { $this->compressData = $compressData; return $this; } /** * @return bool */ public function isPreventCacheSlams(): bool { return $this->preventCacheSlams; } /** * @param bool $preventCacheSlams * @return ConfigurationOption */ public function setPreventCacheSlams(bool $preventCacheSlams): self { $this->preventCacheSlams = $preventCacheSlams; return $this; } /** * @return int */ public function getCacheSlamsTimeout(): int { return $this->cacheSlamsTimeout; } /** * @param int $cacheSlamsTimeout * @return ConfigurationOption */ public function setCacheSlamsTimeout(int $cacheSlamsTimeout): self { $this->cacheSlamsTimeout = $cacheSlamsTimeout; return $this; } /** * @return bool */ public function isUseStaticItemCaching(): bool { return $this->useStaticItemCaching; } /** * @param bool $useStaticItemCaching * @return ConfigurationOption */ public function setUseStaticItemCaching(bool $useStaticItemCaching): self { $this->useStaticItemCaching = $useStaticItemCaching; return $this; } }