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