Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:128021 X-Original-To: internals@lists.php.net Delivered-To: internals@lists.php.net Received: from php-smtp4.php.net (php-smtp4.php.net [45.112.84.5]) by lists.php.net (Postfix) with ESMTPS id 9DF071A00BC for ; Sun, 13 Jul 2025 17:55:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail; t=1752429195; bh=14btF/mZB+X7C0Cdnsa6U9tyuctBiNuAEWy60SPSFxk=; h=Date:Subject:To:References:From:In-Reply-To:From; b=jAVIfE5HleUSSNEwYkj/aA2qoeqnMbtaQZX0bZQBBIAQl5Yg0XLcX4j7kNqb/JepC qTxh6JB2G7D+X2/iNHXhlzyHpf13PQJ+SQm2IcgQtqnaZCFHkoaOUkp0zqE1iTC3sj sZWV4+W09SGzI0mhHxwpxpyTFZKBIBkSEQfTZxRcNESjttW+B8FLeMLp5MQXNW+uat TdT1KDkmNkHnovbkmQghorvdFNnCvhwYeqa7qlmCpnmUzsn1G/YWdrPWS5II/HBqA2 FoJeaJ4gr+hdtnJe4iLiWfSdxHoK4YMBuYEUhE+DAZH+l7RIiD8IEeaFb8QLDvKE1z 5YPRXQEfrBcYQ== Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 881E218005B for ; Sun, 13 Jul 2025 17:53:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,DMARC_MISSING,HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=4.0.1 X-Spam-Virus: Error (Cannot connect to unix socket '/var/run/clamav/clamd.ctl': connect: Connection refused) X-Envelope-From: Received: from wp160.webpack.hosteurope.de (wp160.webpack.hosteurope.de [80.237.132.167]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Sun, 13 Jul 2025 17:53:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mabe.berlin ; s=he194859; h=Content-Type:In-Reply-To:From:References:To:Subject: MIME-Version:Date:Message-ID:From:Sender:Reply-To:Subject:Date:Message-ID:To: Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID: Content-Description:In-Reply-To:References; bh=u4W3H4mtu42xqZQknCdj5m7GAoNqEJ382EZaQvsNu5w=; t=1752429302; x=1752861302; b=IuJkeYKJAbsx8/q8tmalwt/FZPQrXcOU/NpA6ftpFS/LpNYG0vg5t+/X65idprgieAZfW+W9ZhK Fymva9yXUN1ERuxpyB4Nh3AbWUXNE5cFiOmkq6tU8/gxqSUXUOjwTRx05HL+cGE95amoGSVtZZRpp ikRkRScBwmjRvZMCqJZDaXzSEc5k2odrA2V6dpICpxcBmnIPNTkzvHULsRYVWSOhsgzKZqIryHoAY qwzoG/qdbmJkMFPzKFxZcCUPlEWGV03Ud5Iw804oRD0vgFaEbAgs4w+liz6OX1HR7upIR0+l1YoTb j/F/FnHlqzRvXHL6msFcmbkuo5TrbotqdRKA==; Received: from [2a02:8109:b300:8f00:5a7f:6e0b:ff1c:3497]; authenticated by wp160.webpack.hosteurope.de running ExIM with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_128_GCM:128) id 1ub0uj-001GPk-0V; Sun, 13 Jul 2025 19:55:01 +0200 Message-ID: Date: Sun, 13 Jul 2025 19:55:00 +0200 Precedence: bulk list-help: list-post: List-Id: internals.lists.php.net x-ms-reactions: disallow MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PHP-DEV] [RFC] Readonly property hooks To: internals@lists.php.net, Nick References: <1e8634d7-ac1a-4025-b4e2-1948aabf5251@app.fastmail.com> <9D5043B2-1589-4FD5-B289-6E98FB1177BE@nicksdot.dev> <16BD443D-A179-465D-84A0-6E3780F62D8E@gmail.com> <203C1BD7-E688-4E26-8EA6-EA5331525470@nicksdot.dev> <71E5E8FE-605D-4B32-8CCD-F7ECBD454E24@nicksdot.dev> Content-Language: en-US Autocrypt: addr=marc@mabe.berlin; keydata= xsBNBFby8roBCAD4qHjbk9+V3SmB5DfpkTtX58jYJ9VXVfF54MDoI0fQiYvKyrrghfO78alH c12RsEZxLH2F5kEfu8WO4wA4apg2gBnRRxqPj7krsct1ySOAdMrRVp8Wtaeaznpdcn2gJZyA MSI6LTzebT25N77ksvSrUi1BuCKyOa7SmYff3xGgOwYsHQlT5opMNGPCVegiPmO/K37anwts gj6L7RVtjXtp2Z3wAs6r3EmO318PL48xDLUgYMvEFAPJglth5FGH2En6n6HFIhxh43LqXQiN eHVjLjS2y8huNBswwc9ZVxk3ip5z/GCmpWnNkgGBOSJ7loJRsq2tOaU6yU8KWb5rhOoFABEB AAHNIU1hcmMgQmVubmV3aXR6IDxtYXJjQG1hYmUuYmVybGluPsLAeAQTAQIAIgUCVvLyugIb AwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQOTar91O8iM6jzggAwvV6MqU/hcAI6ldp xVjucGz2J9cAWtva8GL+rm9zvEs7EENtamehJiZob/CTw50WiI/zsJzPblktpT0D2AFBEp9k P5/8CmCpZzxYPsxnLtsFM52fOBpO+aP0PSStBpJjndjBH7HPqKcTCXM3ZM+SL6lyRweAJR7G +JXIZbuUrbjB2lbGx3itNZ6TeXqqnE6KTXNKLEbNHfVdzE4sPDkmuZRo/M2h+gmeS1iQb29W BmhvL6czugCQI9rYl7C4Nci9wPii1lTYyfCWQfQKID4/F2HiOv+N/vDMCK1xV8TUeCy8w4X+ nYj+wDog046ki9lUM60oPij6WoSJLqfsXr1kNc7ATQRW8vK6AQgAq7QYLB1Dz+8RSi5AGJP1 tOFQXtcxyOhNVQZsI1mCQiHay4wteQ+5m4EOUuR+FrFIlnbSrPdTkKD2wvQDHVqpZivThBpJ vara/ick0wi2R3dasu1sPMu1P6h1EwUsydhviNJB07aLfPAWD6eoqmGTd8236znIIq7mbnNp OnxIQxviTyELUekrNw38uQtVzR6XZv9PAThA2o1J1JZID7QUpKcNyo9ebYlwxyS+xzhA4DLD qfD6O5sKoKvxEf2fIZeP0ETPpHNYk0WiWnmNoPy8eEY07LriYALVidBwPBcxus0wGoKf8Nun y2aE13SHmj0ioBI1bXMGJx3hEbvzXK6WrwARAQABwsBfBBgBAgAJBQJW8vK6AhsMAAoJEDk2 q/dTvIjOkowIAI70P8U4j3eqyK/7x1bnCZZRcpwZ1aH+LR1yMKTINo9NDqlOBWQTLT69YMfV 4UN+nTSiD/uLw1fSeLSzBwpoalCMLPVOX/d3Mq5JtL5cKtWUTIVf3Vb7VbN4Rvb8HgWjeSnM 1PiG9yQBmLKI68sG/gdgvA/xANdUatkDgG0yj8PCdt+Vy4EblXbIAXZXJ6eRugSKowTjst7i HXKOJxivomHFcmqmkiqjwGTGx/jrhbDtEpPDRk+U9W45D4CbUcyPR6lMSrje5JPGQDv/45M5 wPe286YelBjnb0cWRJpA7GZCWDKZOsQ2H6cCRBi8i4m+vfRk7GLA536XnmvWxKFVP9U= In-Reply-To: <71E5E8FE-605D-4B32-8CCD-F7ECBD454E24@nicksdot.dev> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------KZuE8gRv4WY0HJN0CY6cUJ0k" X-bounce-key: webpack.hosteurope.de;marc@mabe.berlin;1752429302;50d18b72; X-HE-SMSGID: 1ub0uj-001GPk-0V From: marc@mabe.berlin (Marc Bennewitz) This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------KZuE8gRv4WY0HJN0CY6cUJ0k Content-Type: multipart/mixed; boundary="------------fyhiRwq66m3Z0P3XevbJke6v"; protected-headers="v1" From: Marc Bennewitz To: internals@lists.php.net, Nick Message-ID: Subject: Re: [PHP-DEV] [RFC] Readonly property hooks References: <1e8634d7-ac1a-4025-b4e2-1948aabf5251@app.fastmail.com> <9D5043B2-1589-4FD5-B289-6E98FB1177BE@nicksdot.dev> <16BD443D-A179-465D-84A0-6E3780F62D8E@gmail.com> <203C1BD7-E688-4E26-8EA6-EA5331525470@nicksdot.dev> <71E5E8FE-605D-4B32-8CCD-F7ECBD454E24@nicksdot.dev> In-Reply-To: <71E5E8FE-605D-4B32-8CCD-F7ECBD454E24@nicksdot.dev> --------------fyhiRwq66m3Z0P3XevbJke6v Content-Type: multipart/mixed; boundary="------------20RBM5flWwIZWJymozY0Tq40" --------------20RBM5flWwIZWJymozY0Tq40 Content-Type: multipart/alternative; boundary="------------w0lvBWVfNCu0R5Z8j262i0FB" --------------w0lvBWVfNCu0R5Z8j262i0FB Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 DQpPbiAxMy4wNy4yNSAxODoxNywgTmljayB3cm90ZToNCj4NCj4+IE9uIDEzLiBKdWwgMjAy NSwgYXQgMjA6MzgsIE1hcmMgQmVubmV3aXR6IDxtYXJjQG1hYmUuYmVybGluPiB3cm90ZToN Cj4+DQo+PiBIaSBOaWNrLCBDbGF1ZGUsDQo+Pg0KPiBIZXkgTWFyYywNCj4+DQo+PiBJIHRo aW5rIGl0J3MgaW1wb3J0YW50IHRvIGV4cGxpY2l0bHkgbWFyayBpdCBhcyAidGhpcyB2YWx1 ZSB3aWxsIGJlIA0KPj4gc3RvcmVkIGluIG1lbW9yeSIsIEkgbWVhbiBqdXN0IHNpbGVudGx5 IGNhY2hpbmcgdGhlIGdldCBob29rIGNvdWxkIA0KPj4gcXVpY2tseSBsZWFkIHRvIHVuZXhw ZWN0ZWQgYmVoYXZpb3IuIExpa2Ugb25lIHdvdWxkIGV4cGVjdCB0aGUgdmFsdWUgDQo+PiB0 byBiZSBjaGFuZ2VkDQo+Pg0KPiBUaGUgbW9zdCBoZXJlIG1hZGUgdGhlIGFyZ3VtZW50IHRo YXQgImEgY2hhbmdpbmcgdmFsdWUgZnJvbSBhIHJlYWRvbmx5IA0KPiBnZXQgaG9vayIgd291 bGQgYmUgdGhlIHVuZXhwZWN0ZWQgYmVoYXZpb3VyLg0KPiBUaGF04oCZcyB3aHkgd2UgZW5k ZWQgdXAgd2l0aCB0aGUgY3VycmVudCDigJxhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiAN Cj4gMuKAnS4gUGxlYXNlIHNlZSBteSBsYXN0IGFuc3dlciB0byBSb2IgZm9yIGEgZmFpciBl eGFtcGxlIFsxXSAuDQo+DQo+IFRoZSBjdXJyZW50IHByZWZlcnJlZCBhbHRlcm5hdGl2ZSBp bXBsZW1lbnRhdGlvbiBjb3ZlcnMgYm90aCBzaXR1YXRpb25zLi4uDQo+DQo+IElmIGEgcHJv cGVydHkgaXMgYHJlYWRvbmx5YDoNCj4gLSB5b3UgY2FuIHNldCAqb25jZSoNCj4gLSBvbiBy ZWFkIHlvdSBhbHdheXMgZ2V0IHRoZSBzYW1lIChfb25jZV/CoGNvbXB1dGVkKSB2YWx1ZSBi YWNrDQoNClRoaXMgaXMgZXhhY3RseSB0aGUgYmVoYXZpb3IgSSBtZWFuIHdoaWNoIGlzIHNv bWVob3cgdW5leHBlY3RlZCBpZiBub3QgDQptYXJrZWQgZXhwbGljaXRseSBhcyB0aGUgcmVz dWx0IGNvdWxkIGJlIGNhY2hlZCBhbmQgdGhlIHByb3BlcnR5IHZhbHVlIA0Kd2lsbCBuZXZl ciBjaGFuZ2UuDQoNCk5vdCBiZWluZyBhYmxlIHRvIHdyaXRlIHRvIHNvbWV0aGluZyBkb2Vz bid0IGdlbmVyYWxseSBtZWFuIHJlYWRpbmcgdGhlIA0KdmFsdWUgd2lsbCBuZXZlciBjaGFu Z2UuIGBnZXQgPT4gcmFuZG9tX2ludCgwLCAxMDApO2ANCg0KSSBkb24ndCB3YW50IHRvIHNh eSB0aGF0IHRoZSBwYXRoIHdlIHdhbnQgdG8gZ28gd2l0aCByZWFkb25seSBiZWluZyBhYmxl IA0KdG8gYXNzdW1lIHRoZSB2YWx1ZSB3aWxsIG5ldmVyIGNoYW5nZSBpcyB3cm9uZyBidXQg SSB0aGluayBpdCdzIG5vdCANCmNsZWFyIGZvciB0aGUgdXNlciBhbmQgY2FuIGJlIG1pc3Nl ZCBxdWlja2x5IC0gZXZlbiB3aXRoIGEgdGVzdCBhcyB5b3UgDQpoYXZlIHRvIHJlYWQgdGhl IHByb3BlcnR5IG11bHRpcGxlIHRpbWUgdG8gbm90aWNlIHRoZSBkaWZmZXJlbmNlLg0KDQo+ DQo+IElmIGEgcHJvcGVydHkgaXMgTk9UIGByZWFkb25seWA6DQo+IC0geW91IGNhbiBzZXQg Km9mdGVuKg0KPiAtIG9uIHJlYWQgeW91IGFsd2F5cyBnZXQgdGhlIGZyZXNoIChfb2Z0ZW5f wqBjb21wdXRlZCkgdmFsdWUgYmFjaw0KPg0KPiBJIGFyZ3VlIHRoYXQgdGhpcyBpcyBhIHZl cnkgZWFzeSBtZW50YWwgbW9kZWwuDQo+IEkgaG9wZSB0aGF0IHZvdGVycyBhZ3JlZSBvbiDi gJx8Y2FjaGVkfMKgbWF5IGJlIGltcGxpZWQgYnkgfHJlYWRvbmx5fOKAnSwgDQo+IGFzIENs YXVkZSBjYWxsZWQgaXQuDQoNCkFsbCB3aGF0IEknbSBzYXlpbmcgaXMgdGhhdCB0aGlzIGJl aGF2aW9yIHNob3VsZCBiZSBleHBsaWNpdCBhbmQgbm90IA0KYXBwbGllZCBpbXBsaWNpdGx5 IG9uIGEgcmVhZG9ubHkgZ2V0IGhvb2suDQoNCg0KPg0KPj4gYW5kIGFub3RoZXIgb25lIHdv bmRlcnMgd2h5IGEgYmlnIGNodW5rIG9mIG1lbW9yeSB3aWxsIG5vdCBiZSBmcmVlZCANCj4+ IGBnZXQgPT4gJHRoaXMtPnJlYWRCaWdGaWxlKCk7YC4NCj4+DQo+IFdoZXJlIGRvIHlvdSBz ZWUgbm9uLWZyZWVkIG1lbW9yeSBpbiBvbmUgYnV0IG5vdCB0aGUgb3RoZXI/DQo+DQo+IC0g aW4gYm90aCBzY2VuYXJpb3MsIHJlYWRvbmx5IG9yIG5vdCwgdGhlIGByZWFkQmlnRmlsZSgp YCB3aWxsIGVuZCB1cCANCj4gaW4gbWVtb3J5Lg0KPiAtIG9uIGVhY2ggY29uc2VjdXRpdmUg cHJvcGVydHkgY2FsbCB0aGUgdXNhZ2UgaW4gYm90aCBzY2VuYXJpb3MgaXMgdGhlIA0KPiBz YW1lLg0KPiAtIHdoZW4gYXNzaWduaW5nIGEgY2FsbCB0aGUgc2FtZSBwcm9wZXJ0eSB0byBt dWx0aXBsZSB0bXAgdmFycyB0aGUgDQo+IGNhY2hlZCwgb25jZS1jb21wdXRlZCB2ZXJzaW9u IHVzZXMgbGVzcyBtZW1vcnkgdGhhbiB0aGUgbm9uLWNhY2hlZCB2ZXJzaW9uDQo+DQo+IERv IEkgbWlzcyBzb21ldGhpbmc/IERpZCBJIG1pc3VuZGVyc3RhbmQgc29tZXRoaW5nPw0KDQp5 ZXMsIGluIGJvdGggY2FzZXMgdGhlIGRhdGEgd2lsbCBlbmQgdXAgaW4gbWVtb3J5IHVudGls IGFsbCByZWZlcmVuY2VzIA0KYXJlIGdhcmJhZ2VkLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0 IHRoZSBvYmplY3Qgb2YgdGhhdCBwcm9wZXJ0eSBub3cgaGFzIA0KYSByZWZlcmVuY2UgYXMg d2VsbCBhbmQgbmVlZHMgdG8gYmUgZGVzdHJveWVkIGFzIHdlbGwgYmUgYWJsZSB0byBmcmVl IA0KdGhlIG1lbW9yeS4NCg0KPg0KPiBBZGRpdGlvbmFsbHksIHRoZSBjYWNoZWQgdmVyc2lv biBoYXMgdGhlIGJlbmVmaXQgdGhhdCB0aGUgZXhwZW5zaXZlIA0KPiBjb21wdXRhdGlvbiBv bmx5IGhhcHBlbnMgb25jZS4NCj4+DQo+PiBPbiB0aGUgb25lIGhhbmQgSSBsaWtlIHRoZSBj YWNoZWQgbW9kaWZpZXIgYnV0IHBlcnNvbmFsbHkgSSB3b3VsZCANCj4+IHByZWZlciBhIHNl cGFyYXRlIGluaXQgaG9vayBiZWNhdXNlIGl0IHNlZW1zIHRvIGJlIG1vcmUgY2xlYXIgdGhh dCANCj4+IHRoaXMgaXMgYSBiYWNrZWQgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGluaXRpYWxp emVkIG9uY2UuDQo+Pg0KPiBUbyBoYXZlIGFuIGBpbml0YCBob29rIGRvZXNu4oCZdCBzb2x2 ZSB0aGUgZ2V0IGhvb2sgaXNzdWUuDQoNCkFzIGZhciBhcyBJIHVuZGVyc3Rvb2QgdGhlIGlu aXQgaG9vayBpdCB3b3VsZCBzdGlsbCBkaXNhbGxvdyANCnJlYWRvbmx5K2dldCBidXQgYWxs b3cgcmVhZG9ubHkraW5pdCBhbmQgaW5pdCB3b3VsZCBiZSBjYWxsZWQgb25jZSB0aGUgDQpm aXJzdCB0aW1lIHRoZSBwcm9wZXJ0eSBnZXRzIHJlYWQgYW5kIHRoZSByZXN1bHQgd291bGQg ZW5kIHVwIGluIHRoZSANCmJhY2tpbmcgc3RvcmUuDQoNCkFzIGEgcmVzdWx0IHlvdSBnZXQg dGhlIHNhbWUgYmVoYXZpb3IgYXMgYGNhY2hlZCBnZXRgIHdpdGggdGhlIG9ubHkgDQpkaWZm ZXJlbmNlIHRoYXQgeW91IHdyaXRlIGBpbml0ID0+IHJhbmRvbV9pbnQoKTtgIGluc3RlYWQg b2YgYGNhY2hlZCBnZXQgDQo9PiByYW5kb21faW50KCk7YA0KDQpBZGRpdGlvbmFsbHkgaXQg Y2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIHByb3BlcnR5IGZvciBub24gcmVhZG9ubHkg DQpwcm9wZXJ0aWVzIGFzIHdlbGwuDQoNCmBgYA0KY2xhc3MgVGVzdCB7DQogwqDCoMKgIHB1 YmxpYyBpbnQgJHNlZWsgew0KIMKgwqDCoMKgwqDCoMKgIGluaXQgPT4gcmFuZG9tX2ludCgw LCAxMDApO8KgwqAgLy8gY2FsbGVkIG9uY2Ugb24gcmVhZCBpZiBub3QgDQppbml0aWFsaXpl ZA0KIMKgwqDCoMKgwqDCoMKgIGdldCA9PiAkdGhpcy0+c2VlayArIDEwMDsNCiDCoMKgwqDC oMKgwqDCoCBzZXQgPT4gJHRoaXMtPnNlZWsgPSAkdmFsdWUgKyAxMDA7DQogwqDCoMKgIH0N Cn0NCmBgYA0KdmFyX2R1bXAoKG5ldyBUZXN0KCkpLT5zZWVrKTsgLy8gbnVtYmVyIGJldHdl ZW4gMTAwLTIwMCBPUiAyMDAtMzAwIA0KZGVwZW5kaW5nIG9mIHRoZSBzZXQgaG9vayBiZSBj YWxsZWQgb25jZSB3aXRoIHRoZSByZXN1bHQgb2YgaW5pdCBhcyB3ZWxsLg0KDQpPciBkaWQg ScKgbWlzdW5kZXJzdGFuZCBpdD8NCg0KPj4gVGhlIGNhY2hlZCBtb2RpZmllciBJIHdvdWxk IGV4cGVjdCB0byBiZSBhbiBhdHRyaWJ1dGUgYXBwbGljYWJsZSB0byANCj4+IGFueSBmdW5j dGlvbiB3aGljaCB1c2VzIGFub3RoZXIgY2FjaGUgc3RvcmUgc2ltaWxhciB0byBob3cgaXQn cyANCj4+IHBvc3NpYmxlIGluIHB5dGhvbiB0byBtZW1vcml6ZSBmdW5jdGlvbiBjYWxscyB3 aGljaCB3b3VsZCBiZSBhIHZlcnkgDQo+PiBkaWZmZXJlbnQgZmVhdHVyZS4NCj4+DQo+IEFz IGVhcmxpZXIgYW5zd2VyZWQgdG8gQ2xhdWRlIFsyXSwgSSBzZWVrIHRvIHdyaXRlIGxlc3Mg Y29kZS4gVG8gDQo+IGludHJvZHVjZSBhIGBjYWNoZWRgIG1vZGlmaWVyIHZvaWRzIHRoaXMg Zm9yIG5vIHN0cm9uZyByZWFzb24gKHBsZWFzZSANCj4gc2VlIOKAnG1lbnRhbCBtb2RlbOKA nSBhYm92ZSkuDQoNClNlZSBhYm92ZSAtIGFuZCBgaW5pdGAgaXMganVzdCBvbmNlIG1vcmUg Y2hhcmFjdGVyLg0KDQoNCj4gLS0NCj4NCj4gKkNoZWVycywqDQo+IE5pY2sNCj4NCj4gWzFd IGh0dHBzOi8vbmV3cy13ZWIucGhwLm5ldC9waHAuaW50ZXJuYWxzLzEyODAxMA0KPiBbMl0g aHR0cHM6Ly9uZXdzLXdlYi5waHAubmV0L3BocC5pbnRlcm5hbHMvMTI4MDA3DQo+DQo= --------------w0lvBWVfNCu0R5Z8j262i0FB Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On 13.07.25 18:17, Nick wrote:

On 13. Jul 2025, at 20:38, Marc Bennewitz <marc@mabe.berlin> wrote:

Hi Nick, Claude,

Hey Marc,

I think it's important to explicitly mark it as "this value will be stored in memory", I mean just silently caching the get hook could quickly lead to unexpected behavior. Like one would expect the value to be changed

The most here made the argument that "a changing value from a readonly get hook" would be the unexpected behaviour.=C2=A0
That=E2=80=99s why we ended up with the current =E2=80=9Ca= lternative implementation 2=E2=80=9D. Please see my last answer to Rob f= or a fair example [1] .

The current preferred alternative implementation covers both situations...

If a property is `readonly`:=C2=A0
- you can set=C2=A0once
- on read you always get the same (once=C2=A0comp= uted) value back

This is exactly the behavior I mean which is somehow unexpected if not marked explicitly as the result could be cached and the property value will never change.

Not being able to write to something doesn't generally mean reading the value will never change. `get =3D> random_int(0, 100);`

I don't want to say that the path we want to go with readonly being able to assume the value will never change is wrong but I think it's not clear for the user and can be missed quickly - even with a test as you have to read the property multiple time to notice the difference.


If a property is NOT `readonly`:
- you can set=C2=A0often
- on read you always get the fresh (often=C2=A0co= mputed) value back

I argue that this is a very easy mental model.
I hope that voters agree on =E2=80=9Ccached=C2=A0may be implied by=C2=A0readonly=E2=80=9D, as Claude called it.

All what I'm saying is that this behavior should be explicit and not applied implicitly on a readonly get hook.



and another one wonders why a big chunk of memory will not be freed `get =3D> $this->readBigFile();`.

Where do you see non-freed memory in one but not the other?=C2=A0

- in both scenarios, readonly or not, the `readBigFile()` will end up in memory.
- on each consecutive property call the usage in both scenarios is the same.
- when assigning a call the same property to multiple tmp vars the cached, once-computed version uses less memory than the non-cached version

Do I miss something? Did I misunderstand something?

yes, in both cases the data will end up in memory until all references are garbaged. The difference is that the object of that property now has a reference as well and needs to be destroyed as well be able to free the memory.


Additionally, the cached version has the benefit that the expensive computation only happens once.

On the one hand I like the cached modifier but personally I would prefer a separate init hook because it seems to be more clear that this is a backed property that will be initialized once.

To have an `init` hook doesn=E2=80=99t solve the get hook is= sue.

As far as I understood the init hook it would still disallow readonly+get but allow readonly+init and init would be called once the first time the property gets read and the result would end up in the backing store.

As a result you get the same behavior as `cached get` with the only difference that you write `init =3D> random_int();` instead= of `cached get =3D> random_int();`

Additionally it can be used to initialize a property for non readonly properties as well.

```
class Test {
=C2=A0=C2=A0=C2=A0 public int $seek {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 init =3D> random_int(= 0, 100);=C2=A0=C2=A0 // called once on read if not initialized
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 get =3D> $this->se= ek + 100;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 set =3D> $this->se= ek =3D $value + 100;
=C2=A0=C2=A0=C2=A0 }
}
```
var_dump((new Test())->seek); // number between 100-200 OR 200-300 depending of the set hook be called once with the result of init as well.

Or did I=C2=A0misunderstand it?

The cached modifier I would expect to be an attribute applicable to any function which uses another cache store similar to how it's possible in python to memorize function calls which would be a very different feature.

As earlier answered to Claude [2], I seek to write less code. To introduce a `cached` modifier voids this for no strong reason (please see =E2=80=9Cmental model=E2=80=9D above).

See above - and `init` is just once more character.


=C2=A0
--

Cheers,
Nick


--------------w0lvBWVfNCu0R5Z8j262i0FB-- --------------20RBM5flWwIZWJymozY0Tq40 Content-Type: application/pgp-keys; name="OpenPGP_0x3936ABF753BC88CE.asc" Content-Disposition: attachment; filename="OpenPGP_0x3936ABF753BC88CE.asc" Content-Description: OpenPGP public key Content-Transfer-Encoding: quoted-printable -----BEGIN PGP PUBLIC KEY BLOCK----- xsBNBFby8roBCAD4qHjbk9+V3SmB5DfpkTtX58jYJ9VXVfF54MDoI0fQiYvKyrrg hfO78alHc12RsEZxLH2F5kEfu8WO4wA4apg2gBnRRxqPj7krsct1ySOAdMrRVp8W taeaznpdcn2gJZyAMSI6LTzebT25N77ksvSrUi1BuCKyOa7SmYff3xGgOwYsHQlT 5opMNGPCVegiPmO/K37anwtsgj6L7RVtjXtp2Z3wAs6r3EmO318PL48xDLUgYMvE FAPJglth5FGH2En6n6HFIhxh43LqXQiNeHVjLjS2y8huNBswwc9ZVxk3ip5z/GCm pWnNkgGBOSJ7loJRsq2tOaU6yU8KWb5rhOoFABEBAAHNIU1hcmMgQmVubmV3aXR6 IDxtYXJjQG1hYmUuYmVybGluPsLAeAQTAQIAIgUCVvLyugIbAwYLCQgHAwIGFQgC CQoLBBYCAwECHgECF4AACgkQOTar91O8iM6jzggAwvV6MqU/hcAI6ldpxVjucGz2 J9cAWtva8GL+rm9zvEs7EENtamehJiZob/CTw50WiI/zsJzPblktpT0D2AFBEp9k P5/8CmCpZzxYPsxnLtsFM52fOBpO+aP0PSStBpJjndjBH7HPqKcTCXM3ZM+SL6ly RweAJR7G+JXIZbuUrbjB2lbGx3itNZ6TeXqqnE6KTXNKLEbNHfVdzE4sPDkmuZRo /M2h+gmeS1iQb29WBmhvL6czugCQI9rYl7C4Nci9wPii1lTYyfCWQfQKID4/F2Hi Ov+N/vDMCK1xV8TUeCy8w4X+nYj+wDog046ki9lUM60oPij6WoSJLqfsXr1kNc7A TQRW8vK6AQgAq7QYLB1Dz+8RSi5AGJP1tOFQXtcxyOhNVQZsI1mCQiHay4wteQ+5 m4EOUuR+FrFIlnbSrPdTkKD2wvQDHVqpZivThBpJvara/ick0wi2R3dasu1sPMu1 P6h1EwUsydhviNJB07aLfPAWD6eoqmGTd8236znIIq7mbnNpOnxIQxviTyELUekr Nw38uQtVzR6XZv9PAThA2o1J1JZID7QUpKcNyo9ebYlwxyS+xzhA4DLDqfD6O5sK oKvxEf2fIZeP0ETPpHNYk0WiWnmNoPy8eEY07LriYALVidBwPBcxus0wGoKf8Nun y2aE13SHmj0ioBI1bXMGJx3hEbvzXK6WrwARAQABwsBfBBgBAgAJBQJW8vK6AhsM AAoJEDk2q/dTvIjOkowIAI70P8U4j3eqyK/7x1bnCZZRcpwZ1aH+LR1yMKTINo9N DqlOBWQTLT69YMfV4UN+nTSiD/uLw1fSeLSzBwpoalCMLPVOX/d3Mq5JtL5cKtWU TIVf3Vb7VbN4Rvb8HgWjeSnM1PiG9yQBmLKI68sG/gdgvA/xANdUatkDgG0yj8PC dt+Vy4EblXbIAXZXJ6eRugSKowTjst7iHXKOJxivomHFcmqmkiqjwGTGx/jrhbDt EpPDRk+U9W45D4CbUcyPR6lMSrje5JPGQDv/45M5wPe286YelBjnb0cWRJpA7GZC WDKZOsQ2H6cCRBi8i4m+vfRk7GLA536XnmvWxKFVP9U=3D =3Doi2m -----END PGP PUBLIC KEY BLOCK----- --------------20RBM5flWwIZWJymozY0Tq40-- --------------fyhiRwq66m3Z0P3XevbJke6v-- --------------KZuE8gRv4WY0HJN0CY6cUJ0k Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature.asc" -----BEGIN PGP SIGNATURE----- wsB5BAABCAAjFiEENJIbKB0SAX2RmUKbOTar91O8iM4FAmhz8vQFAwAAAAAACgkQOTar91O8iM4I dwgA8zL512UFnBPk6zwr0mOny1QW2FqirKtoauoYXyh/u17k6VFLYWRiMz7TWbxniQ55SExpzwwe feaCckaBiQ2KatjHCCwumHcVN6DuSE/X+SssO+eC2lE4u2K/LfzorAra2f54HHdSlL0ueKmSFAXA l/GcdEP7u6YrJPenV1xMop2vAyTEEMQsPj+57psYeN2xshS6MC3JTfVsfAkvB/XMJVXwxIReIDdu vJQT7r/LzwPUIUqrl2SugnrnWXoeToCj6HPeOVodIKe7uOZdNKsTIBNmUUoB4Um/J5n8omN10tUq a4nitaal5bElpBU7FLfrgLP0UTvRPU8p3ETtbVvSZQ== =+HUt -----END PGP SIGNATURE----- --------------KZuE8gRv4WY0HJN0CY6cUJ0k--