Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:104741 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 81812 invoked from network); 15 Mar 2019 15:05:27 -0000 Received: from unknown (HELO mail-wm1-f52.google.com) (209.85.128.52) by pb1.pair.com with SMTP; 15 Mar 2019 15:05:27 -0000 Received: by mail-wm1-f52.google.com with SMTP id e16so5829135wme.1 for ; Fri, 15 Mar 2019 04:56:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:references:from:openpgp:autocrypt:message-id:date :user-agent:mime-version:in-reply-to; bh=/GN4VibKBV4yAa+Jrb/gCMrJEx8958vDh12OD56wEQU=; b=H5nBuiQ+TTu1nV1PLMdnOpgHejVdHiRpCuaUS8ELap2Z5pwlCV5aHg2mVjcRzSK08A ClWUFlU9cmL9QzOtKvrdYrdEqbOMKeF+oRWA1XUTMwoYPfNGH7AzX74Djd+39+eTj7zW 5BPZkZDB7d06c7VjZnzBj/E4aha77bIcYdfC5zDTf5f22Uzcc4C0wWug8SJGmNfrTx/x nQGT+tsxtHCil1HiwKmeRhrq7M/duCVzsMGe4I938Wk00+B49MaosOH28GNx7Em9l/Qq RBpiRAmkeH32THXJ35ThQoSI0oX8wqMo9fH6tM4O0IwDZA4MOBjc5fkDA3gKScx1ihQ/ ZbEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:references:from:openpgp :autocrypt:message-id:date:user-agent:mime-version:in-reply-to; bh=/GN4VibKBV4yAa+Jrb/gCMrJEx8958vDh12OD56wEQU=; b=t9Dwsh+JMiSCCxWGK6O3YFCtf+grqzg14mZcQi5NnvsHHsp5ew/RgHAYy/IOEGdykp YcmBMDHG3q/jL2E8oXowmKm8voI9u9QLkMG0QdNMg3doIZX+oplN1Thh80ANOoVLLhn7 hrduAu6XXT6rPCXwPEWEMFzPxfW5fBeWZVbEqJyV5MVkBgTjn0x1AH6l3Z1/+o0LLiSB Wi6XC3F1kcdXkBJ3V6ETH54JKMTVSmA2myAT6PwbEP6cMYkEfJn1Lycz3/N0ni8mN0W8 LNRVsgnvpCnL8t+lQY1WWtwbj8aU0Qq7amg4oC9TmcYH8jeqzxt/p1sprh0eruTXew9j ZPsw== X-Gm-Message-State: APjAAAXE1dXUmeaevV0V4bbkNZIISgBM7Z3Uybkyv/G4NgH4FNPD2hAs azLDyDT97ziuwg5RRXW7rarvcsr2eJo= X-Google-Smtp-Source: APXvYqwXNQsq88hSIhEzoL4PqBEaGP3FHT+EIdHFdmQeXLB2urPqtDqwB3S5fyxNx0wB6e6X41bhhg== X-Received: by 2002:a7b:c044:: with SMTP id u4mr1969249wmc.88.1552650964371; Fri, 15 Mar 2019 04:56:04 -0700 (PDT) Received: from [192.168.2.11] ([194.106.241.122]) by smtp.googlemail.com with ESMTPSA id t3sm3221815wmc.20.2019.03.15.04.56.02 for (version=TLS1_3 cipher=AEAD-AES128-GCM-SHA256 bits=128/128); Fri, 15 Mar 2019 04:56:03 -0700 (PDT) Sender: Michael Wallner To: internals@lists.php.net References: <5c8b20a5.1c69fb81.9f316.039bSMTPIN_ADDED_MISSING@mx.google.com> Openpgp: preference=signencrypt Autocrypt: addr=mike@php.net; prefer-encrypt=mutual; keydata= mQENBFDcYVsBCADZmu3ac2q1H+Tz8S3XrNQGs+TBHRBpEsafPQBn6wpdMdJ/GDeSYxwoItoy jLWmg8cc45SWLYHzU3gkcSgljoivYnwbLbEZnCqE1V//oQYaMIAcQvO6nnGHWcFN6WyRl6wl 3K866fYmwzE+H2JymjIY0YBdV7/oXDRUNrGaF7C7XAjY13sI0Uq8BV/q6J3e0xTQw+VAaf6X 7mQvQjIgNipTe44ozVPEJSfNpUzPn2uV8ancWru6dmtm3fZZkGUcxNhXsVsEX7R1iHNWBuXS qsKmi5KViWbajg6juha/rbQd2b05PxJGH6ctGyMeU9ubJqIoVBpHeGyuGaizcv98686NABEB AAG0JU1pY2hhZWwgV2FsbG5lciAobTZ3NikgPG1pa2VAcGhwLm5ldD6JATcEEwEIACEFAla0 mo8CGwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQSA4+FLCkx8dRVAf/a1POvRGQnpIj hB6AplnFUx3GaIUlrTiUkZMyhftfk7Wgr3b+X4UitoVTaBm6Zsd8wPCwL2T5fD1B3QBq6N+G RscCzOq87Co6ZmrLApBTqv89MvF8sCGGuXhKpAClLbe9Un9GFunbrnJk21Q6AqJVeIFSYPQ/ LmPaAJ3oFifdPyI8W8OFB5GnkH7JImvFr/vH90zm0rt5hSwdpuV5PxxbcCZkAuVw/8OZ+Zup WBqwo9keLTzaGuzLNtruP62OXuwKuaryw80eWfZn5SxI41NVjoSLfDeoBdFarFtQFJUyEEXp uA4LED/aYxKbvTIZxTn/zC2mrheKn5iLKmJQjVCz67kBDQRQ3GFbAQgAxmWfmElDtz7IzOOH TWl3/vLih1dARzgJSv62v2mkQwcb9UyMmM5ZDyYZw36ZFoSyrcDxUipWfLk3wiV9+dqOidBH aVVJ9Oub15FZE0i4wkHPColkvEGCrwxWBSLQouYet9YzeWR/CzODylUPNDOWWqyOAT+2A68t jbRIQDONJhrqJPY+DWZinEewE8FxAFgcjCPGG512vTPmbg7OnWGWs1oORTFerAMWyNfxYdph MVad8b0uLX3csUXF+XVCQcwEwxfmiuDDYULmqYcDskbnG1lDBfpEngRZIbQ4ml15jhocc4Sv QnPKtNqBX6k3PWd/qdjk5JG8X9vYZDrG11BewQARAQABiQEfBBgBAgAJBQJQ3GFbAhsMAAoJ EEgOPhSwpMfHtwYIALi5sLY7FO2oiTihyHLeJXleV+2uP69KgoZdhdp8M/wOAc6bGr3L2wEK lF1lcCJAZBqgm6rPX8HFWgiH8FIgJEaR2ecOt+FNLqR0DKXTm785dpjHxQFOGbVM2zK+BsD9 Xnput34d9NcXhyOeABhi3eIJUATWY210OyC9siEGipBIK0eLnbFlaUOt83L75yn7TD58LSmh /Sp3GGFprmNL+5WrSyl1uy7bo+1qi4nOWikFL31lahQ4Zs73ST9GeTbd+wLDqSvHD/GP9Z8Y 8jNw+niBhKOLvFFrP7EUTchqjR36xPosf/MnqdETRiaV9c+J762X7vzwFazSCbAZ5h8CIL4= Message-ID: Date: Fri, 15 Mar 2019 12:56:01 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.5.1 MIME-Version: 1.0 In-Reply-To: <5c8b20a5.1c69fb81.9f316.039bSMTPIN_ADDED_MISSING@mx.google.com> Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="Jfv0z36f0Wi13hl6Io4cKpCVI8BOzZe1C" Subject: Re: [PHP-DEV] [Proposal] Struct Data Types From: mike@php.net (Michael Wallner) --Jfv0z36f0Wi13hl6Io4cKpCVI8BOzZe1C Content-Type: multipart/mixed; boundary="KE3t55W5APBOtihK7s0N70vr3r8guNxYe"; protected-headers="v1" From: Michael Wallner To: internals@lists.php.net Message-ID: Subject: Re: [PHP-DEV] [Proposal] Struct Data Types References: <5c8b20a5.1c69fb81.9f316.039bSMTPIN_ADDED_MISSING@mx.google.com> In-Reply-To: <5c8b20a5.1c69fb81.9f316.039bSMTPIN_ADDED_MISSING@mx.google.com> --KE3t55W5APBOtihK7s0N70vr3r8guNxYe Content-Type: text/plain; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: quoted-printable On 15/03/2019 04:49, Kenneth Ellis McCall wrote: > Hey all, >=20 > I'm looking to get feedback on a RFC I want to propose. >=20 > PHP RFC: Addition of the 'struct' data type. >=20 > Introduction: > PHP has many data types, but does not offer something that is the > equivalent to the C struct data type. >=20 > 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 mi= x > of a class and an array. Would this type be a COW or pass-by-ref type? Because.. I guess that could make all the difference... If it's gonna be pass-by-ref, and I assume so, because you explicitly mentioned immutable, then it's just a class minus behaviour? That would probably simplify internals a lot, I guess? >=20 > Pros: > Provides a data type which would immutable and self-validating by > mandatory type hinting. >=20 > Cons: > ? >=20 > Possible future considerations: > Advanced Type Validators. >=20 > Use cases: > Configurations, DTOs, anything that needs a strict schema. >=20 > Proposed usage / syntax: > struct MyStuct > { > =C2=A0=C2=A0=C2=A0 boolean|bool=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop01'; > =C2=A0=C2=A0=C2=A0 integer|int=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop02'; > =C2=A0=C2=A0=C2=A0 double=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop0= 3'; > =C2=A0=C2=A0=C2=A0 string=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop0= 4'; > =C2=A0=C2=A0=C2=A0 array=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 = 'prop05'; > =C2=A0=C2=A0=C2=A0 object=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop0= 6'; > =C2=A0=C2=A0=C2=A0 resource=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop07'; > =C2=A0=C2=A0=C2=A0 callable=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop08'; > =C2=A0=C2=A0=C2=A0 iterable=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop09'; > =C2=A0=C2=A0=C2=A0 Acme\MyClass=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop10'; > =C2=A0=C2=A0=C2=A0 Acme\ConfStruct=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 'prop11'; > =C2=A0=C2=A0=C2=A0 array Acme\AnotherStruct=C2=A0 'prop12'; > =C2=A0=C2=A0=C2=A0 ?boolean|bool=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop13'; > =C2=A0=C2=A0=C2=A0 ?integer|int=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop14'; > =C2=A0=C2=A0=C2=A0 ?double=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop15';= > =C2=A0=C2=A0=C2=A0 ?string=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop16';= > =C2=A0=C2=A0=C2=A0 ?array=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop1= 7'; > =C2=A0=C2=A0=C2=A0 ?object=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop18';= > =C2=A0=C2=A0=C2=A0 ?resource=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop19'; > =C2=A0=C2=A0=C2=A0 ?callable=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop20'; > =C2=A0=C2=A0=C2=A0 ?iterable=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop21'; > =C2=A0=C2=A0=C2=A0 ?Acme\MyClass=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'prop22'; > =C2=A0=C2=A0=C2=A0 ?Acme\ConfStruct=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 'prop23'; > =C2=A0=C2=A0=C2=A0 ?array Acme\AnotherStruct 'prop24'; > } > OR? >=20 > struct MyStuct > { > =C2=A0=C2=A0=C2=A0 'prop01': boolean|bool; > =C2=A0=C2=A0=C2=A0 'prop02': integer|int; > =C2=A0=C2=A0=C2=A0 'prop03': float; > =C2=A0=C2=A0=C2=A0 'prop04': string; > =C2=A0=C2=A0=C2=A0 'prop05': array; > =C2=A0=C2=A0=C2=A0 'prop06': object; > =C2=A0=C2=A0=C2=A0 'prop07': resource; > =C2=A0=C2=A0=C2=A0 'prop08': callable; > =C2=A0=C2=A0=C2=A0 'prop09': iterable; > =C2=A0=C2=A0=C2=A0 'prop10': Acme\MyClass; > =C2=A0=C2=A0=C2=A0 'prop11': Acme\ConfStruct; > =C2=A0=C2=A0=C2=A0 'prop12': array Acme\AnotherStruct; > =C2=A0=C2=A0=C2=A0 'prop13': ?boolean|bool; > =C2=A0=C2=A0=C2=A0 'prop14': ?integer|int; > =C2=A0=C2=A0=C2=A0 'prop15': ?float; > =C2=A0=C2=A0=C2=A0 'prop16': ?string; > =C2=A0=C2=A0=C2=A0 'prop17': ?array; > =C2=A0=C2=A0=C2=A0 'prop18': ?object; > =C2=A0=C2=A0=C2=A0 'prop19': ?resource; > =C2=A0=C2=A0=C2=A0 'prop20': ?callable; > =C2=A0=C2=A0=C2=A0 'prop21': ?iterable; > =C2=A0=C2=A0=C2=A0 'prop22': ?Acme\MyClass; > =C2=A0=C2=A0=C2=A0 'prop23': ?Acme\ConfStruct; > =C2=A0=C2=A0=C2=A0 'prop24': ?array Acme\AnotherStruct; > } >=20 > struct Acme\ConfStruct > { > =C2=A0=C2=A0=C2=A0 string 'host'; > =C2=A0=C2=A0=C2=A0 ?int 'port'; > } >=20 > struct Acme\AnotherStruct > { > =C2=A0=C2=A0=C2=A0 string 'firstName'; > =C2=A0=C2=A0=C2=A0 string 'lastName'; > =C2=A0=C2=A0=C2=A0 ?integer 'age'; > } >=20 > Acme\ConfStruct $a =3D { > =C2=A0=C2=A0=C2=A0 'host' =3D> '127.0.0.1', > =C2=A0=C2=A0=C2=A0 'port' =3D> 8088 > } >=20 > Acme\MyStruct $myStruct =3D { > =C2=A0=C2=A0=C2=A0 'prop01' =3D> true, > =C2=A0=C2=A0=C2=A0 'prop02' =3D> 1, > =C2=A0=C2=A0=C2=A0 'prop03' =3D> 1.01, > =C2=A0=C2=A0=C2=A0 'prop04' =3D> 'Hello', > =C2=A0=C2=A0=C2=A0 'prop05' =3D> ['a', 'b', 'c'], > =C2=A0=C2=A0=C2=A0 'prop06' =3D> new stdClass(), > =C2=A0=C2=A0=C2=A0 'prop07' =3D> fopen('xyz.txt', 'wb'), > =C2=A0=C2=A0=C2=A0 'prop08' =3D> function() { > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 return 1 + 1; > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 }, > =C2=A0=C2=A0=C2=A0 'prop09' =3D> [ > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [1, 2, 3], > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [4, 5, 6], > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [7, 8, 9] > =C2=A0=C2=A0=C2=A0 ], > =C2=A0=C2=A0=C2=A0 'prop10' =3D> new Acme\MyClass, > =C2=A0=C2=A0=C2=A0 'prop11' =3D> $a, > =C2=A0=C2=A0=C2=A0 'prop12' =3D> [ > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Acme\AnotherStruct [ > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'fir= stName' =3D> 'Bob', > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'las= tName'=C2=A0 =3D> 'Walker' > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ], > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Acme\AnotherStruct [ > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'fir= stName' =3D> 'Little', > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'las= tName'=C2=A0 =3D> 'Johnny', > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'age= '=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D> 5 > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ], > =C2=A0=C2=A0=C2=A0 ], > =C2=A0=C2=A0=C2=A0 'prop13' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop14' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop15' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop16' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop17' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop18' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop19' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop20' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop21' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop22' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop23' =3D> null, > =C2=A0=C2=A0=C2=A0 'prop24' =3D> null > }; >=20 > $x =3D new Some\Other\Class($myStruct); >=20 > echo $myStruct['prop02']; > OR? >=20 > echo $myStruct->prop02; > Warning / Errors / Exceptions: > Acme\MyStruct $a =3D { > =C2=A0=C2=A0=C2=A0 'prop01' =3D> 5, > =C2=A0=C2=A0=C2=A0 ... > } > // Should: throw new TypeError("'prop01' should be set as a boolean > type, integer type was attempted.") >=20 > echo $a['xyz']; // or echo $a->xyz (which ever is the preferred syntax > after comments). > // Should: trigger_error("Notice: Undefined property: > Acme\MyStruct::xyz"); >=20 >=20 > https://github.com/ellisgl/PHP-RFC-Struct-Data-Type >=20 I'd prefer a syntax more resembling the current syntax for declaring classes: struct Config { bool $enabled =3D true; ?string $path =3D null; } The draft does not specify what features of classes/arrays will remain after "mixing" it to a struct type. --=20 Regards, Mike --KE3t55W5APBOtihK7s0N70vr3r8guNxYe-- --Jfv0z36f0Wi13hl6Io4cKpCVI8BOzZe1C Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEHsPHHd1jWDGjN9aESA4+FLCkx8cFAlyLktIACgkQSA4+FLCk x8c/6gf8C5EbDv2rE+wVwEjaOXBaDiua+WOtScSJQhr1XyT1STyHFdqavpnJhSHe YgUpeu0p8gkUzPJUAcxAmoPAhXw8L9xKkUPz0lKrpOiDOlDh04jlGlxf8AXlUjBd NtP2XKQK+m2rfXsENW6BOKLblEqtjEtX4Eijyi5XpgQgApqdEBDkqETBSEl7OwPf 1aUbEo8Yiu0hRdXIzUM2FpibwRM7+qE/ltUbpk/od0YQpljHAFsIkzt5BgMTQKvm 0yLiP01EcxtSGNf3nvnf3lWTw7cUZj+XbOqOr/Z0M/fWVpFte37OOIKekIH6faUb J2tSd2G+GX4O3KM6jVFIzcM1YFZJKg== =/xPv -----END PGP SIGNATURE----- --Jfv0z36f0Wi13hl6Io4cKpCVI8BOzZe1C--