/** * StringifyException constructor. * @param string $message * @param string $file * @param int $line * @param int $code * @param \Exception $previous * @internal */ public function __construct($message, $file, $line, $code = 0, $previous = null) { LJSON::restoreErrorHandler(); parent::__construct($message, $code, $previous); $this->file = $file; $this->line = $line; }
/** * @param mixed $value * @param int $parameterCount * @return string * @throws \Kanti\StringifyException * @api * @example example/example1.php 15 1 */ public static function stringify($value, $parameterCount = 0) { if (is_null($value) || is_bool($value) || is_int($value) || is_float($value) || is_double($value) || is_numeric($value) || is_string($value)) { return json_encode($value); } if ($value instanceof \stdClass) { $value = (array) $value; if (empty($value)) { return '{}'; } } if (is_object($value) && in_array("JsonSerializable", class_implements($value))) { /** * @var $value \JsonSerializable */ $value = $value->jsonSerialize(); } if (is_array($value)) { /** * @var $value \array */ if ($value === []) { return '[]'; } foreach ($value as $key => $item) { $value[$key] = static::stringify($item, $parameterCount); } if (array_keys($value) !== range(0, count($value) - 1)) { //isAssoc $result = '{'; foreach ($value as $key => $v) { $result .= '"' . $key . '":' . $v . ','; } return rtrim($result, ',') . '}'; } return '[' . implode(',', $value) . ']'; } if ($value instanceof Parameter) { /** * @var $value Parameter */ return $value->getParameterResult(); } if (is_callable($value)) { /** * @var $value \callable */ $reflection = new \ReflectionFunction($value); $params = []; for ($i = 0; $i < count($reflection->getParameters()); $i++) { $paramName = "v" . ($i + $parameterCount); $params[$paramName] = new Parameter($paramName); } $parameterCount += count($params); static::$errorHandlerSet = true; $oldEH = function () { }; $oldEH = set_error_handler(function ($severity, $message, $filename, $lineNumber) use(&$oldEH) { $message = preg_replace("/Object of class Kanti\\\\Parameter could not be converted to (.*)/", "Parameter's can not be converted (to \$1)", $message, -1, $count); if ($count) { throw new StringifyException($message, $filename, $lineNumber, 1448007982); } try { $oldEH($severity, $message, $filename, $lineNumber); } catch (\Exception $e) { LJSON::restoreErrorHandler(); throw $e; } }); $newValue = call_user_func_array($value, $params); LJSON::restoreErrorHandler(); $value = static::stringify($newValue, $parameterCount); return "(" . implode(',', array_keys($params)) . ") => (" . $value . ")"; } throw new StringifyException('Type not supported ', __FILE__, __LINE__, 1448007971); }