=> " . Objects::toString($element); } else { $elements[] = Objects::toString($element); } }); return $elements; } private static function arrayToString(array $array) { $elements = self::stringifyArrayElements($array); return '[' . implode(', ', $elements) . ']'; } /** * Convert boolean to string 'true' or 'false'. * * @param bool $var * @return string */ public static function booleanToString($var) { return $var ? 'true' : 'false'; } /** * @param mixed $object * @param string $names * @param mixed $value */ public static function setValueRecursively($object, $names, $value) { $fields = explode('->', $names); $destinationField = array_pop($fields); $destinationObject = self::getValueRecursively($object, implode('->', $fields)); if ($destinationObject !== null) { $destinationObject->$destinationField = $value; } } /** * @param mixed $object * @param string $names * @param null|mixed $default * @param bool $accessPrivate * @return mixed|null */ public static function getValueRecursively($object, $names, $default = null, $accessPrivate = false) { $fields = Arrays::filter(explode('->', $names), Functions::notBlank()); foreach ($fields as $field) { $object = self::getValueOrCallMethod($object, $field, null, $accessPrivate); if ($object === null) { return $default; } } return $object; } /** * @param mixed $object * @param string $field * @param mixed $default * @param bool $accessPrivate * @return mixed|null */ public static function getValueOrCallMethod($object, $field, $default, $accessPrivate = false) { $value = self::getValue($object, $field, null, $accessPrivate); if ($value !== null) { return $value; } return self::callMethod($object, $field, $default); } /** * @param mixed $object * @param string $field * @param null|mixed $default * @param bool $accessPrivate * @return mixed|null */ public static function getValue($object, $field, $default = null, $accessPrivate = false) { if (is_array($object)) { return Arrays::getValue($object, $field, $default); } if (isset($object->$field)) { return $object->$field; } if ($accessPrivate) { $class = new ReflectionObject($object); if ($class->hasProperty($field)) { $property = $class->getProperty($field); $property->setAccessible(true); return $property->getValue($object); } } return $default; } /** * @param mixed $object * @param string $methodName * @param mixed $default * @return mixed */ public static function callMethod($object, $methodName, $default) { $name = rtrim($methodName, '()'); if (method_exists((object) $object, $name)) { $result = $object->$name(); return $result === null ? $default : $result; } return $default; } /** * Returns true if $a is equal to $b. Comparison is based on the following rules: * - same type + same type = strict check * - object + object = loose check * - array + array = compares arrays recursively with these rules * - string + integer = loose check ('1' == 1) * - boolean + string ('true' or 'false') = loose check * - false in other cases ('' != null, '' != 0, '' != false) * * Example: * * $result = Objects::equal(array('1'), array(1)); * * Result: * * true * * @param $a * @param $b * @return bool */ public static function equal($a, $b) { if ($a === $b) { return true; } return self::_convertToComparable($a) == self::_convertToComparable($b); } public static function _convertToComparable($value) { if ($value === null) { return "____ouzo_null_marker_so_that_null_!=_''"; } $type = gettype($value); if ($type == 'boolean') { $value = $value ? 'true' : 'false'; } elseif ($type == 'array') { array_walk_recursive($value, function (&$value) { $value = Objects::_convertToComparable($value); }); } elseif ($type != 'object') { $value = $type != 'object' ? (string)$value : $value; } return $value; } }