On this page
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
.