@@ -297,24 +297,35 @@ protected function emitArray($result, $array) {
297
297
}
298
298
299
299
protected function emitParameter ($ result , $ parameter ) {
300
+ $ result ->locals [$ parameter ->name ]= true ;
300
301
$ parameter ->annotations && $ this ->emitOne ($ result , $ parameter ->annotations );
301
- if ($ parameter ->type && $ t = $ this ->literal ($ parameter ->type )) {
302
- $ result ->out ->write ($ t .' ' );
302
+
303
+ // If we have a non-constant default and a type, emit a nullable type hint
304
+ // to prevent "implicitely nullable type" warnings being raised. See here:
305
+ // https://wiki.php.net/rfc/deprecate-implicitly-nullable-types
306
+ $ type = $ parameter ->type ;
307
+ if ($ parameter ->default ) {
308
+ $ const = $ this ->isConstant ($ result , $ parameter ->default );
309
+ if ($ type && !$ const && !$ type instanceof IsNullable) {
310
+ $ type = new IsNullable ($ parameter ->type );
311
+ }
303
312
}
313
+ if ($ type && $ t = $ this ->literal ($ type )) $ result ->out ->write ($ t .' ' );
314
+
304
315
if ($ parameter ->variadic ) {
305
316
$ result ->out ->write ('... $ ' .$ parameter ->name );
306
317
} else {
307
318
$ result ->out ->write (($ parameter ->reference ? '& ' : '' ).'$ ' .$ parameter ->name );
308
319
}
320
+
309
321
if ($ parameter ->default ) {
310
- if ($ this -> isConstant ( $ result , $ parameter -> default ) ) {
322
+ if ($ const ) {
311
323
$ result ->out ->write ('= ' );
312
324
$ this ->emitOne ($ result , $ parameter ->default );
313
325
} else {
314
326
$ result ->out ->write ('=null ' );
315
327
}
316
328
}
317
- $ result ->locals [$ parameter ->name ]= true ;
318
329
}
319
330
320
331
protected function emitSignature ($ result , $ signature , $ use = null ) {
0 commit comments