getPropertyLevels($name); $value = $this->getProperties(); foreach ($levels as $level) { if ($value instanceof IArrayClass) { if (!$value->has($level)) { return false; } $value = $value->get($level); } else { if (!isset($value[$level])) { return false; } $value = $value[$level]; } } return true; } /** * Get a property value * * @param string|string[]|IArrayCast $name The property name * @param mixed $default The default value if property is not set * Raise an exception if property is not set AND $default is Null * * @return mixed The property value * * @throws UnexpectedValueException If property is not set AND $default is Null */ public function getProperty ($name, $default = null) { if (!$this->hasProperty($name)) { if ($default === null) { throw new UnexpectedValueException('The "' . $name . '" property is not set'); } return $default; } $levels = $this->getPropertyLevels($name); $value = $this->getProperties(); foreach ($levels as $level) { if ($value instanceof IArrayClass) { $value = $value->get($level); } else { $value = $value[$level]; } } return $value; } /** * Provide the multi-level separator * * Reimplements to override * * @return string The separator */ protected function getPropertySeparator (): string { return '/'; } /** * Get array of levels of a property name * * @param string|string[]|IArrayCast $propertyName The property name * * @return ImmutableArrayClass The property levels */ private function getPropertyLevels ($propertyName): ImmutableArrayClass { if ($propertyName instanceof IArrayCast) { $parts = $propertyName->toArray(); } elseif (is_array($propertyName)) { $parts = $propertyName; } else { $parts = explode($this->getPropertySeparator(), $propertyName); } return new ImmutableArrayClass($parts); } }