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; |
|
} |
|
}
|
|
|