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