, * } * @extends AbstractFilter * @final */ class ToNull extends AbstractFilter { public const TYPE_BOOLEAN = 1; public const TYPE_INTEGER = 2; public const TYPE_EMPTY_ARRAY = 4; public const TYPE_STRING = 8; public const TYPE_ZERO_STRING = 16; public const TYPE_FLOAT = 32; public const TYPE_ALL = 63; /** * @deprecated since 2.26 - superseded by self::CONSTANTS * * @var array */ protected $constants = self::CONSTANTS; private const CONSTANTS = [ self::TYPE_BOOLEAN => 'boolean', self::TYPE_INTEGER => 'integer', self::TYPE_EMPTY_ARRAY => 'array', self::TYPE_STRING => 'string', self::TYPE_ZERO_STRING => 'zero', self::TYPE_FLOAT => 'float', self::TYPE_ALL => 'all', ]; /** @var Options */ protected $options = [ 'type' => self::TYPE_ALL, ]; /** * @phpcs:disable Generic.Files.LineLength.TooLong * @param int-mask-of|value-of|list|Options|iterable|null $typeOrOptions */ public function __construct($typeOrOptions = null) { if ($typeOrOptions === null || $typeOrOptions === '') { return; } if ($typeOrOptions instanceof Traversable) { $typeOrOptions = iterator_to_array($typeOrOptions); } if (is_array($typeOrOptions) && isset($typeOrOptions['type'])) { $this->setOptions($typeOrOptions); return; } $this->setType($typeOrOptions); } /** * Set boolean types * * @param int-mask-of|value-of|list|null $type * @throws Exception\InvalidArgumentException * @return self */ public function setType($type = null) { if (is_array($type)) { $detected = 0; foreach ($type as $value) { if (is_int($value)) { $detected |= $value; } elseif (($found = array_search($value, self::CONSTANTS, true)) !== false) { $detected |= $found; } } $type = $detected; } elseif (is_string($type) && ($found = array_search($type, self::CONSTANTS, true)) !== false) { $type = $found; } if (! is_int($type) || ($type < 0) || ($type > self::TYPE_ALL)) { throw new Exception\InvalidArgumentException(sprintf( 'Unknown type value "%s" (%s)', $type, gettype($type) )); } $this->options['type'] = $type; return $this; } /** * Returns defined boolean types * * @return int-mask-of */ public function getType() { return $this->options['type']; } /** * Defined by Laminas\Filter\FilterInterface * * Returns null representation of $value, if value is empty and matches * types that should be considered null. * * @param null|array|bool|float|int|string $value * @return null|mixed */ public function filter($value) { $type = $this->getType(); // FLOAT (0.0) if ($type & self::TYPE_FLOAT) { if (is_float($value) && $value === 0.0) { return null; } } // STRING ZERO ('0') if ($type & self::TYPE_ZERO_STRING) { if (is_string($value) && $value === '0') { return null; } } // STRING ('') if ($type & self::TYPE_STRING) { if (is_string($value) && $value === '') { return null; } } // EMPTY_ARRAY (array()) if ($type & self::TYPE_EMPTY_ARRAY) { if (is_array($value) && $value === []) { return null; } } // INTEGER (0) if ($type & self::TYPE_INTEGER) { if (is_int($value) && $value === 0) { return null; } } // BOOLEAN (false) if ($type & self::TYPE_BOOLEAN) { if (is_bool($value) && $value === false) { return null; } } return $value; } }