Файл: vendor/nette/schema/src/Schema/Helpers.php
Строк: 88
<?php
/**
* This file is part of the Nette Framework (https://nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare(strict_types=1);
namespace NetteSchema;
use Nette;
use NetteUtilsReflection;
/**
* @internal
*/
final class Helpers
{
use NetteStaticClass;
public const PREVENT_MERGING = '_prevent_merging';
/**
* Merges dataset. Left has higher priority than right one.
* @return array|string
*/
public static function merge($value, $base)
{
if (is_array($value) && isset($value[self::PREVENT_MERGING])) {
unset($value[self::PREVENT_MERGING]);
return $value;
}
if (is_array($value) && is_array($base)) {
$index = 0;
foreach ($value as $key => $val) {
if ($key === $index) {
$base[] = $val;
$index++;
} else {
$base[$key] = static::merge($val, $base[$key] ?? null);
}
}
return $base;
} elseif ($value === null && is_array($base)) {
return $base;
} else {
return $value;
}
}
public static function getPropertyType(ReflectionProperty $prop): ?string
{
if (!class_exists(NetteUtilsType::class)) {
throw new NetteNotSupportedException('Expect::from() requires nette/utils 3.x');
} elseif ($type = NetteUtilsType::fromReflection($prop)) {
return (string) $type;
} elseif ($type = preg_replace('#s.*#', '', (string) self::parseAnnotation($prop, 'var'))) {
$class = Reflection::getPropertyDeclaringClass($prop);
return preg_replace_callback('#[w\\]+#', function ($m) use ($class) {
return Reflection::expandClassName($m[0], $class);
}, $type);
}
return null;
}
/**
* Returns an annotation value.
* @param ReflectionProperty $ref
*/
public static function parseAnnotation(Reflector $ref, string $name): ?string
{
if (!Reflection::areCommentsAvailable()) {
throw new NetteInvalidStateException('You have to enable phpDoc comments in opcode cache.');
}
$re = '#[s*]@' . preg_quote($name, '#') . '(?=s|$)(?:[ t]+([^@s]S*))?#';
if ($ref->getDocComment() && preg_match($re, trim($ref->getDocComment(), '/*'), $m)) {
return $m[1] ?? '';
}
return null;
}
/**
* @param mixed $value
*/
public static function formatValue($value): string
{
if (is_object($value)) {
return 'object ' . get_class($value);
} elseif (is_string($value)) {
return "'" . NetteUtilsStrings::truncate($value, 15, '...') . "'";
} elseif (is_scalar($value)) {
return var_export($value, true);
} else {
return strtolower(gettype($value));
}
}
}