props = $props; } /** * Add a property value, fails if the property exists * * @param string $prop Property name * @param mixed $value Value * @throws PropertyException if the property already exists */ public function add(string $prop, $value) { if (array_key_exists($prop, $this->props)) { throw new PropertyException("Property already exists"); } $this->props[$prop] = $value; } /** * Set a property value, create the property if it doesn't * exist. * * @param string $prop Property name * @param mixed $value Value */ public function set(string $prop, $value) { $this->props[$prop] = $value; } /** * Apply properties without removing anything. * * @param array $props The properties to apply */ public function setAll(array $props) { $this->props = array_merge( $this->props, $props ); } /** * Get the value of a property, fails if the property does not exist. * Use the value() method to get with a default value * * @param string $prop Property name * @return mixed * @throws PropertyException if the property does not exist */ public function get(string $prop) { if (!array_key_exists($prop, $this->props)) { throw new PropertyException("No such property"); } return $this->props[$prop]; } /** * Retrieve all properties. * * @return array */ public function getAll(): array { return $this->props; } /** * Retrieve all properties as a json string * * @return string */ public function getJson(): string { return json_encode($this->props, JSON_UNESCAPED_SLASHES); } /** * Get the value of the property, or use the provided default value. * * @param string $prop Property name * @param mixed|null $default Default value * @return mixed */ public function valueOf(string $prop, $default=null) { return array_key_exists($prop, $this->props) ? $this->props[$prop] : $default; } /** * Remove a property * * @param string $prop Property name */ public function delete(string $prop) { unset($this->props[$prop]); } /** * Check if a property is present * * @param string $prop Property name */ public function has(string $prop): bool { return array_key_exists($prop, $this->props); } /** * Check if all the provided properties are present * * @param array $props Property names */ public function hasAll(array $props) { foreach ($props as $prop) { if (!$this->has($prop)) return false; } return true; } }