Blame | Letzte Änderung | Log anzeigen | RSS feed
<?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 separatelyif (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 markreturn (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 processedif ($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;}}