Migrating from laminas-code v2 to v3

string, int, float, bool are no longer ignored

In 2.x, a Laminas\Code\Generator\ParameterGenerator with name foo and type string, int, float or bool simply generated code "$foo":

$generator = new \Laminas\Code\ParameterGenerator('foo');

$generator->setType('string');

echo $generator->generate(); // "$foo"

In 3.x, this code will instead produce "string $foo". If you generate code that should run in PHP 5.x, it is advisable to strip string, int, float and bool from type definitions passed to Laminas\Code\ParameterGenerator instances. The quickest way is to set the type to null, if it matches any of these scalar types:

if (in_array($type, ['string', 'int', 'float', 'bool'])) {
    $type = null;
}

$generator->setType($type);

ParameterReflection::getType() changes

PHP 7 introduced ReflectionParameter#getType().

In order to not override this method, Laminas\Code\Reflection\ParameterReflection#getType() was renamed to Laminas\Code\Reflection\ParameterReflection#detectType().

If you relied on Laminas\Code\Reflection\ParameterReflection#getType(), you can simply replace the method calls in your code.

DocBlock types ignored by ParameterGenerator::fromReflection()

As a direct consequence of the previous change, calls to Laminas\Code\Generator\ParameterGenerator::fromReflection() will not mirror the type hints read from a method's DocBlock.

As an example, take following code:

class Foo
{
    /**
     * @param string $baz
     */
    public function bar($baz)
    {
    }
}

$methodGenerator = \Laminas\Code\Generator\MethodGenerator::fromReflection(
    new \Laminas\Code\Reflection\MethodReflection('Foo', 'bar')
);

var_dump($methodGenerator->getParameters()[0]->getType());

In version 2.x, this code produces "string", in version 3.x it returns null. If you need to rely on the types in the annotations, please use Laminas\Code\Reflection\ParameterReflection#detectType() instead, and build a MethodGenerator instance manually.

This change is required: since signatures in PHP 7 include scalar type hints. That also means that reflecting scalar type hints from DocBlocks into the signature of a generated method may lead to fatal errors (due to signature mismatch) at runtime.

Type strings are validated

If you attempt to generate type-hints for parameters or return types, those types are now validated before the code is generated.

Be sure to check which values you pass to Laminas\Code\Generator\MethodGenerator#setReturnType() or Laminas\Code\Generator\ParameterGenerator#setType(), as you may incur in a Laminas\Code\Generator\Exception\InvalidArgumentException being thrown if any of those types are invalid strings:

$parameterGenerator->setType('foo'); // valid
$parameterGenerator->setType('array'); // valid
$parameterGenerator->setType('bool'); // valid
$parameterGenerator->setType('123'); // invalid (throws exception)
$parameterGenerator->setType(''); // invalid (throws exception)
$parameterGenerator->setType('*'); // invalid (throws exception)
$parameterGenerator->setType('\\'); // invalid (throws exception)

Generated type-hints are now prefixed by "\"

Generated type-hints are now prefixed with the NAMESPACE_SEPARATOR, "\".

Take following example code:

$parameter = new \Laminas\Code\Generator\ParameterGenerator('bar', 'baz');
$method    = new \Laminas\Code\Generator\MethodGenerator('foo', [$parameter]);

$method->setReturnType('tab');

echo $method->generate();

This code produces public function foo(baz $bar) {} in 2.x. In version 3.x, it produces public function foo(\baz $bar) : \tab {}.

In order to avoid migration problems, be sure to always pass fully qualified class names to Laminas\Code\Generator\MethodGenerator and Laminas\Code\Generator\ParameterGenerator.

ParameterGenerator::$simple was removed

If you extended Laminas\Code\Generator\ParameterGenerator, be sure to check if you are accessing the protected static variable $simple: it was removed, and you should adapt your code by either copying it into your class or avoiding its usage.

ParameterGenerator::$type has changed

If you extended Laminas\Code\Generator\ParameterGenerator, be sure to check if you are accessing the protected variable $type: its type has changed. While it can still be used as a string via an explicit (string) cast, the type of this protected member is now null|Laminas\Code\Generator\TypeGenerator.