designtopack/public/site/plugins/kql/src/Kql/Help.php

110 lines
2.1 KiB
PHP

<?php
namespace Kirby\Kql;
use ReflectionMethod;
class Help
{
public static function for($object)
{
if (is_array($object) === true) {
return static::forArray($object);
}
if (is_object($object) === true) {
return static::forObject($object);
}
return [
'type' => gettype($object),
'value' => $object
];
}
public static function forArray(array $array)
{
return [
'type' => 'array',
'keys' => array_keys($array),
];
}
public static function forMethod($object, $method)
{
$reflection = new ReflectionMethod($object, $method);
$returns = null;
$params = [];
if ($returnType = $reflection->getReturnType()) {
$returns = $returnType->getName();
}
foreach ($reflection->getParameters() as $param) {
$p = [
'name' => $param->getName(),
'required' => $param->isOptional() === false,
'type' => $param->hasType() ? $param->getType()->getName() : null,
];
if ($param->isDefaultValueAvailable()) {
$p['default'] = $param->getDefaultValue();
}
$call = null;
if ($p['type'] !== null) {
$call = $p['type'] . ' ';
}
$call .= '$' . $p['name'];
if ($p['required'] === false && isset($p['default']) === true) {
$call .= ' = ' . var_export($p['default'], true);
}
$p['call'] = $call;
$params[$p['name']] = $p;
}
$call = '.' . $method;
if (empty($params) === false) {
$call .= '(' . implode(', ', array_column($params, 'call')) . ')';
}
return [
'call' => $call,
'name' => $method,
'params' => $params,
'returns' => $returns
];
}
public static function forMethods($object, $methods)
{
$methods = array_unique($methods);
$reflection = [];
sort($methods);
foreach ($methods as $methodName) {
if (method_exists($object, $methodName) === false) {
continue;
}
$reflection[$methodName] = static::forMethod($object, $methodName);
}
return $reflection;
}
public static function forObject($object)
{
$original = $object;
$object = Interceptor::replace($original);
return $object->__debugInfo();
}
}