Allowing `(object)['key' => 'value']` in initializers?

From: Date: Sat, 25 Sep 2021 15:45:16 +0000
Subject: Allowing `(object)['key' => 'value']` in initializers?
Groups: php.internals 
Request: Send a blank email to internals+get-116158@lists.php.net to get a copy of this message
Hi internals, In PHP 8.1, it is possible to allow constructing any class name in an initializer, after the approval of https://wiki.php.net/rfc/new_in_initializers ``` php > static $x1 = new ArrayObject(['key' => 'value']); php > static $x2 = new stdClass(); php > static $x3 = (object)['key' => 'value']; Fatal error: Constant expression contains invalid operations in php shell code on line 1 ``` What are your thoughts on allowing the (object) cast in initializer types where new was already allowed, but only when followed by an array literal node. (e.g. continue to forbid (object)SOME_CONSTANT) (see https://wiki..php.net/rfc/new_in_initializers) stdClass has never implemented a factory method such as __set_state (which is not yet allowed). Instead, (object)[] or the (object)array() shorthand is typically used when a generic object literal is needed. This is also how php represents objects in var_export. ``` php > var_export(new stdClass()); (object) array( ) ``` Reasons: - The ability to construct empty stdClass instances but not non-empty ones is something users would find surprising, and a lack of support for (object)[] be even more inconsistent if factory methods were allowed in the future. - stdClass is useful for some developers, e.g. in unit tests, when using libraries requiring it for parameters, when you need to ensure data is encoded as a JSON {} rather than [], etc. - It would help developers write a clearer api contract for methods, e.g. function setData(stdClass $default = (object)['key' => 'value']) is clearer than function setData(?stdClass $default = null) { $default ??= (object)['key' => 'value']; - stdClass may be the only efficient built-in way to represent objects with arbitrary names if RFCs such as https://externals.io/message/115800 passed Thanks, Tyson

« previous php.internals (#116158) next »