Description
Describe the bug
After upgrading our project from PHP 7.4 to PHP 8.1 this deprecation warning appeared:
Deprecated Functionality: Optional parameter $baz declared before required parameter $quux is implicitly treated as a required parameter.
To Reproduce
This type:
<xs:complexType
name="Foo">
<xs:sequence>
<xs:element name="baz" maxOccurs="1" minOccurs="0" nillable="true"
type="xs:string"/>
<xs:element name="qux" maxOccurs="1" minOccurs="1" nillable="false"
type="xs:string"/>
<xs:element name="quux" maxOccurs="1" minOccurs="1" nillable="true"
type="xs:date"/>
<xs:element name="corge" maxOccurs="1" minOccurs="1" nillable="false"
type="xs:string"/>
<xs:element name="grault" maxOccurs="unbounded" minOccurs="1" nillable="true"
type="tns:Bar"/>
</xs:sequence>
</xs:complexType>
will result in this generated code:
public function __construct(string $qux, string $corge, ?string $baz = null, ?string $quux, ?array $grault)
{
$this
->setQux($qux)
->setCorge($corge)
->setBaz($baz)
->setQuux($quux)
->setGrault($grault);
}
It seems that nillable parameters get sorted after non-nillable parameters, but other than that, the order of the XML is kept. Parameters with default values are not ordered last and thus can not be omitted when creating an object of this class.
Expected behavior
Constructor parameters of generated classes should appear in this order:
- Required parameters that are not nillable
- Required parameters that are nillable
- Optional parameters
This is the expected generated code for the given example:
public function __construct(string $qux, string $corge, ?string $quux, ?array $grault, ?string $baz = null)
{
$this
->setQux($qux)
->setCorge($corge)
->setQuux($quux)
->setGrault($grault)
->setBaz($baz);
}
Additional context
(https://www.php.net/manual/en/migration80.deprecated.php)