You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.5 KiB
131 lines
3.5 KiB
<?php
|
|
|
|
/*
|
|
Copyright (c) 2009 hamcrest.org
|
|
*/
|
|
|
|
class FactoryParameter
|
|
{
|
|
/**
|
|
* @var FactoryMethod
|
|
*/
|
|
private $method;
|
|
|
|
/**
|
|
* @var ReflectionParameter
|
|
*/
|
|
private $reflector;
|
|
|
|
public function __construct(FactoryMethod $method, ReflectionParameter $reflector)
|
|
{
|
|
$this->method = $method;
|
|
$this->reflector = $reflector;
|
|
}
|
|
|
|
/**
|
|
* Compute the declaration code.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getDeclaration()
|
|
{
|
|
$code = $this->getTypeCode() . $this->getInvocation();
|
|
|
|
if ($this->reflector->isOptional()) {
|
|
$default = $this->reflector->getDefaultValue();
|
|
if (is_null($default)) {
|
|
$default = 'null';
|
|
} elseif (is_bool($default)) {
|
|
$default = $default ? 'true' : 'false';
|
|
} elseif (is_string($default)) {
|
|
$default = "'" . $default . "'";
|
|
} elseif (is_numeric($default)) {
|
|
$default = strval($default);
|
|
} elseif (is_array($default)) {
|
|
$default = 'array()';
|
|
} else {
|
|
echo 'Warning: unknown default type for ' . $this->getMethod()->getFullName() . "\n";
|
|
var_dump($default);
|
|
$default = 'null';
|
|
}
|
|
$code .= ' = ' . $default;
|
|
}
|
|
return $code;
|
|
}
|
|
|
|
/**
|
|
* Compute the type code for the paramater.
|
|
*
|
|
* @return string
|
|
*/
|
|
private function getTypeCode()
|
|
{
|
|
// Handle PHP 5 separately
|
|
if (PHP_VERSION_ID < 70000) {
|
|
if ($this->reflector->isArray()) {
|
|
return 'array';
|
|
}
|
|
|
|
$class = $this->reflector->getClass();
|
|
|
|
return $class ? sprintf('\\%s ', $class->getName()) : '';
|
|
}
|
|
|
|
if (!$this->reflector->hasType()) {
|
|
return '';
|
|
}
|
|
|
|
$type = $this->reflector->getType();
|
|
$name = self::getQualifiedName($type);
|
|
|
|
// PHP 7.1+ supports nullable types via a leading question mark
|
|
return (PHP_VERSION_ID >= 70100 && $type->allowsNull()) ? sprintf('?%s ', $name) : sprintf('%s ', $name);
|
|
}
|
|
|
|
/**
|
|
* Compute qualified name for the given type.
|
|
*
|
|
* This function knows how to prefix class names with a leading slash and
|
|
* also how to handle PHP 8's union types.
|
|
*
|
|
* @param ReflectionType $type
|
|
*
|
|
* @return string
|
|
*/
|
|
private static function getQualifiedName(ReflectionType $type)
|
|
{
|
|
// PHP 8 union types can be recursively processed
|
|
if ($type instanceof ReflectionUnionType) {
|
|
return implode('|', array_map(function (ReflectionType $type) {
|
|
// The "self::" call within a Closure is fine here because this
|
|
// code will only ever be executed on PHP 7.0+
|
|
return self::getQualifiedName($type);
|
|
}, $type->getTypes()));
|
|
}
|
|
|
|
// PHP 7.0 doesn't have named types, but 7.1+ does
|
|
$name = $type instanceof ReflectionNamedType ? $type->getName() : (string) $type;
|
|
|
|
return $type->isBuiltin() ? $name : sprintf('\\%s', $name);
|
|
}
|
|
|
|
/**
|
|
* Compute the invocation code.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getInvocation()
|
|
{
|
|
return sprintf('$%s', $this->reflector->getName());
|
|
}
|
|
|
|
/**
|
|
* Compute the method name.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getMethod()
|
|
{
|
|
return $this->method;
|
|
}
|
|
}
|