Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:104730 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 47862 invoked from network); 15 Mar 2019 06:58:17 -0000 Received: from unknown (HELO localhost.localdomain) (76.75.200.58) by pb1.pair.com with SMTP; 15 Mar 2019 06:58:17 -0000 To: internals@lists.php.net X-Mozilla-News-Host: news://pair1.php.net:119 Date: Thu, 14 Mar 2019 22:49:00 -0500 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0 SeaMonkey/2.49.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Posted-By: 99.39.88.55 Subject: [Proposal] Struct Data Types From: xellisx@gmail.com (Kenneth Ellis McCall) Message-ID: Hey all, I'm looking to get feedback on a RFC I want to propose. PHP RFC: Addition of the 'struct' data type. Introduction: PHP has many data types, but does not offer something that is the equivalent to the C struct data type. The purpose of this RFC is to propose a data type of 'struct', which would be a strictly typed, immutable data structure that resembles a mix of a class and an array. Pros: Provides a data type which would immutable and self-validating by mandatory type hinting. Cons: ? Possible future considerations: Advanced Type Validators. Use cases: Configurations, DTOs, anything that needs a strict schema. Proposed usage / syntax: struct MyStuct { boolean|bool 'prop01'; integer|int 'prop02'; double 'prop03'; string 'prop04'; array 'prop05'; object 'prop06'; resource 'prop07'; callable 'prop08'; iterable 'prop09'; Acme\MyClass 'prop10'; Acme\ConfStruct 'prop11'; array Acme\AnotherStruct 'prop12'; ?boolean|bool 'prop13'; ?integer|int 'prop14'; ?double 'prop15'; ?string 'prop16'; ?array 'prop17'; ?object 'prop18'; ?resource 'prop19'; ?callable 'prop20'; ?iterable 'prop21'; ?Acme\MyClass 'prop22'; ?Acme\ConfStruct 'prop23'; ?array Acme\AnotherStruct 'prop24'; } OR? struct MyStuct { 'prop01': boolean|bool; 'prop02': integer|int; 'prop03': float; 'prop04': string; 'prop05': array; 'prop06': object; 'prop07': resource; 'prop08': callable; 'prop09': iterable; 'prop10': Acme\MyClass; 'prop11': Acme\ConfStruct; 'prop12': array Acme\AnotherStruct; 'prop13': ?boolean|bool; 'prop14': ?integer|int; 'prop15': ?float; 'prop16': ?string; 'prop17': ?array; 'prop18': ?object; 'prop19': ?resource; 'prop20': ?callable; 'prop21': ?iterable; 'prop22': ?Acme\MyClass; 'prop23': ?Acme\ConfStruct; 'prop24': ?array Acme\AnotherStruct; } struct Acme\ConfStruct { string 'host'; ?int 'port'; } struct Acme\AnotherStruct { string 'firstName'; string 'lastName'; ?integer 'age'; } Acme\ConfStruct $a = { 'host' => '127.0.0.1', 'port' => 8088 } Acme\MyStruct $myStruct = { 'prop01' => true, 'prop02' => 1, 'prop03' => 1.01, 'prop04' => 'Hello', 'prop05' => ['a', 'b', 'c'], 'prop06' => new stdClass(), 'prop07' => fopen('xyz.txt', 'wb'), 'prop08' => function() { return 1 + 1; }, 'prop09' => [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ], 'prop10' => new Acme\MyClass, 'prop11' => $a, 'prop12' => [ Acme\AnotherStruct [ 'firstName' => 'Bob', 'lastName' => 'Walker' ], Acme\AnotherStruct [ 'firstName' => 'Little', 'lastName' => 'Johnny', 'age' => 5 ], ], 'prop13' => null, 'prop14' => null, 'prop15' => null, 'prop16' => null, 'prop17' => null, 'prop18' => null, 'prop19' => null, 'prop20' => null, 'prop21' => null, 'prop22' => null, 'prop23' => null, 'prop24' => null }; $x = new Some\Other\Class($myStruct); echo $myStruct['prop02']; OR? echo $myStruct->prop02; Warning / Errors / Exceptions: Acme\MyStruct $a = { 'prop01' => 5, ... } // Should: throw new TypeError("'prop01' should be set as a boolean type, integer type was attempted.") echo $a['xyz']; // or echo $a->xyz (which ever is the preferred syntax after comments). // Should: trigger_error("Notice: Undefined property: Acme\MyStruct::xyz"); https://github.com/ellisgl/PHP-RFC-Struct-Data-Type