volatile = $volatile; $this->volatile_values = []; } /** * Whether a constant is defined or not. * * @param string $offset * * @return bool */ public function offsetExists( $offset ) { return $this->volatile ? isset( $this->volatile_values[ $offset ] ) : defined( $offset ); } /** * Gets a constant value. * * @param string $offset * * @return mixed */ public function offsetGet( $offset ) { return $this->volatile ? $this->volatile_values[ $offset ] : constant( $offset ); } /** * Sets the value of a constant if not already defined. * * @param string $offset * @param mixed $value */ public function offsetSet( $offset, $value ) { if ( $this->volatile && ! isset( $this->volatile_values[ $offset ] ) ) { $this->volatile_values[ $offset ] = $value; } else { if ( ! defined( $offset ) ) { define( $offset, $value ); } } } /** * Unsets a constant if in volatile mode. * * @param string $offset */ public function offsetUnset( $offset ) { if ( $this->volatile ) { $this->volatile_values = array_diff( $this->volatile_values, [ $offset ] ); } else { // no op } } }