Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:123119 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 qa.php.net (Postfix) with ESMTPS id DA7671A009C for ; Fri, 12 Apr 2024 07:29:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail; t=1712907007; bh=szPuAu644GG/sKcrQUFwu2a6iUD3yJJRD2wCs1cdMtI=; h=Date:Subject:To:References:From:In-Reply-To:From; b=bQAXZ95HwSkY8PCqno4gI23lZ+gw3DeEfNVbClKCjzTcQoFOQmrd4vPYfSSTMqh2X wq4f0s0BQdyqiUsFP4EX+Z4ej+TFQfnCrb1KU/g0npUNCl6ASFWH+JMT8WwOtXQrAK SxH0D+Rd/K0PkCMFs9tDjBHLbh2VmDXEZ5UlPy11kMP6MG/IdNO/oUcnpFQG1S79FX 0FRQfFNl6M6TJrzVIsUlfn9JBefTibjGZ82tx6omag+SXLG3wXj812tfQ9N/hcomMI HQEZWn2shCQ/bvSX1YqLvWptBmOdkQvI8UUY18zLgxWbp1KEvYpCeRpVJWl9WpSGVG 8DQ9WAEijmrcA== Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 9E3D2180004 for ; Fri, 12 Apr 2024 07:30:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=BAYES_50,DKIM_INVALID, DKIM_SIGNED,DMARC_MISSING,HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_SBL_A autolearn=no autolearn_force=no version=4.0.0 X-Spam-Virus: No 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 ; Fri, 12 Apr 2024 07:30:04 +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=a32pgyHDxtFhaPS/YJfOOGpyaLiLeD8NC+YuWYeHvZI=; t=1712906971; x=1713338971; b=ff/lDMSZbqxtoRbVoxvZyTp93UT9TJmOzg1+Pa3RFrO23ZdyC3nTflfjEQOs3mHI1CMplmBijm zP+V6rhgt1xufpSt47smf3Bd+vIUCt7e1qjxTR9Z9cr5iAPuBzXQSOEsfFg3u7hJr9HBEpP4ugafU NPj6m43G3adgQnEKZ6i1tw0jj+nzOJS3vj6WeiwnSAhk+HwUXFa/dsXBj7yGr6m+FyA5EOU0zi0Ll ePxGzUTS2y1RgOKiW6u+hNYm4WG3e9QaECJ933KiuaPxacqkwdoHA95nf2/knusJ5MijhF63joB+8 dRDpKrWMfgE7s5J1mXP5DW+skDUneH/pholsQ==; Received: from [2a02:8109:b323:1700:7501:9d8b:548b:b3d3]; authenticated by wp160.webpack.hosteurope.de running ExIM with esmtpsa (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) id 1rvBLl-0008I2-7Q; Fri, 12 Apr 2024 09:29:29 +0200 Message-ID: <937f01d2-e29f-442f-b935-ccf0a33557fc@mabe.berlin> Date: Fri, 12 Apr 2024 09:29:28 +0200 Precedence: bulk list-help: list-post: List-Id: internals.lists.php.net MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PHP-DEV] [RFC][Vote announcement] Property hooks To: internals@lists.php.net References: <66154AA0.1040905@adviesenzo.nl> <66160A1D.4060409@adviesenzo.nl> <6618A2B1.70501@adviesenzo.nl> 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: <6618A2B1.70501@adviesenzo.nl> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------gEoOvp2zQHoa40z0teJKYUAm" X-bounce-key: webpack.hosteurope.de;marc@mabe.berlin;1712906971;507a4fe8; X-HE-SMSGID: 1rvBLl-0008I2-7Q From: marc@mabe.berlin (Marc Bennewitz) This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------gEoOvp2zQHoa40z0teJKYUAm Content-Type: multipart/mixed; boundary="------------3uH3uWOyfuZ8JdNxih0YMB2O"; protected-headers="v1" From: Marc Bennewitz To: internals@lists.php.net Message-ID: <937f01d2-e29f-442f-b935-ccf0a33557fc@mabe.berlin> Subject: Re: [PHP-DEV] [RFC][Vote announcement] Property hooks References: <66154AA0.1040905@adviesenzo.nl> <66160A1D.4060409@adviesenzo.nl> <6618A2B1.70501@adviesenzo.nl> In-Reply-To: <6618A2B1.70501@adviesenzo.nl> --------------3uH3uWOyfuZ8JdNxih0YMB2O Content-Type: multipart/mixed; boundary="------------DXRc4m358Y5vIyqIpP3GMb32" --------------DXRc4m358Y5vIyqIpP3GMb32 Content-Type: multipart/alternative; boundary="------------oag0GTm3IaABhW035AEGcVz4" --------------oag0GTm3IaABhW035AEGcVz4 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 SGksDQoNCk9uIDEyLjA0LjI0IDA0OjU1LCBKdWxpZXR0ZSBSZWluZGVycyBGb2xtZXIgd3Jv dGU6DQo+IEhpIElsaWphLA0KPg0KPiBPbiAxMi00LTIwMjQgMTowMCwgSWxpamEgVG92aWxv IHdyb3RlOg0KPiA8c25pcD4NCj4NCj4+PiBPaCwgYW5kIGhhbmcgb24sIHRoZXkgKmNhbiog YmUgcmVhZCBmcm9tIGEgbWV0aG9kIGluIHRoZSBzYW1lIGNsYXNzIGFzIGxvbmcgYXMgdGhh dCBtZXRob2QgaXMgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBzZXQgaG9vaywgc28gbm93IHRo ZSBtZXRob2Qgd2lsbCBuZWVkIHRvIGVpdGhlciBkbyBhIGJhY2t0cmFjZSBvciB1c2UgUmVm bGVjdGlvbiB0byBmaWd1cmUgb3V0IHdoZXRoZXIgaXQgaGFzIGFjY2VzcyB0byB0aGUgcHJv cGVydHkgdmFsdWUuDQo+PiBSaWdodC4gV2UgdXNlIHRoZSBzYW1lIG1lY2hhbmlzbSBhcyBg X19nZXRgL2BfX3NldGAgdXNlcyB0byBwcm90ZWN0DQo+PiBhZ2FpbnN0IHJlY3Vyc2lvbi4g SW4gcGFydGljdWxhciwgd2hlbiBlbnRlcmluZyBhIG1hZ2ljIG1ldGhvZCBmb3IgYQ0KPj4g cGFydGljdWxhciBwcm9wZXJ0eSwgUEhQIHJlbWVtYmVycyB0aGlzIHVzaW5nIGEgInByb3Bl cnR5IGd1YXJkIi4gSXQncw0KPj4gcmVhbGx5IGp1c3QgYSBtYXJrZXIgaW4gdGhlIG9iamVj dCB0aGF0IHNldHMgdGhlIG1hZ2ljIG1ldGhvZCB0eXBlLA0KPj4gYWxvbmcgd2l0aCB0aGUg cHJvcGVydHkgbmFtZS4NCj4+DQo+PiBXaGVuIHRoZSBzYW1lIHByb3BlcnR5IGlzIGFjY2Vz c2VkIGFnYWluLCB0aGUgbWFnaWMgbWV0aG9kIG9yIGhvb2sgaXMNCj4+IHNraXBwZWQsIGFu ZCBQSFAgYmVoYXZlcyBhcyBpZiB0aGUgbWFnaWMgbWV0aG9kIG9yIGhvb2sgd2Fzbid0IHRo ZXJlDQo+PiBhdCBhbGwuIEZvciBgX19nZXRgLCBgX19zZXRgIGFuZCBob29rcyBvZiB2aXJ0 dWFsIHByb3BlcnRpZXMsIHRoaXMNCj4+IG1lYW5zIGFjY2Vzc2luZyBhIGR5bmFtaWMgcHJv cGVydHkuIEZvciBiYWNrZWQgcHJvcGVydGllcywgdGhpcyBtZWFucw0KPj4gYWNjZXNzaW5n IGl0cyBiYWNraW5nIHZhbHVlLg0KPj4NCj4+IEFmdGVyIGRpc2N1c3NpbmcgaXQsIHdlJ3Zl IGRlY2lkZWQgdG8gbWFrZSB2aXJ0dWFsIHByb3BlcnRpZXMgc2xpZ2h0bHkNCj4+IGxlc3Mg c3VycHJpc2luZyBieSB0aHJvd2luZywgaW5zdGVhZCBvZiB0cnlpbmcgdG8gY3JlYXRlIGEg ZHluYW1pYw0KPj4gcHJvcGVydHkuIFRoaXMgd291bGQgYmUgY29uc2lzdGVudCB3aXRoIGhv dyB2aXJ0dWFsIHJlYWQtLCBhbmQNCj4+IHdyaXRlLW9ubHkgcHJvcGVydGllcyBhcmUgaGFu ZGxlZCBvdXRzaWRlIG9mIGhvb2tzLCB3aGVuIHRoZXkgYXJlDQo+PiB3cml0dGVuIHRvIG9y IHJlYWQsIHJlc3BlY3RpdmVseS4NCj4NCj4gRm9yZ2l2ZSBtZSwgYnV0IEkgaGFkIHRvIGNo dWNrbGUgYXQgdGhlIG1lbnRpb24gb2YgdmlydHVhbCBwcm9wZXJ0aWVzIA0KPiBuZWVkaW5n IHRvIGFjY2VzcyBhIGR5bmFtaWMgcHJvcGVydHkgaW4gdGhlIGNvbnRleHQgb2YgYSBwcm9w ZXJ0eSBndWFyZC4NCj4gTXkgdGhvdWdodHMgd2VudCBzdHJhaWdodCB0byB0aGUgZm9sbG93 aW5nIHF1ZXN0aW9uICJEb2VzIHRoaXMgbWVhbiANCj4gdGhhdCBzdXBwb3J0IGZvciBkeW5h bWljIHByb3BlcnRpZXMgY291bGQgbmV2ZXIgYmUgcmVtb3ZlZCBpZiB0aGlzIFJGQyANCj4g Z2V0cyB2b3RlZCBpbiA/IEFuZCBpZiBzbywgY2FuIHdlIHBsZWFzZSBnZXQgcmlkIG9mIHRo ZSBkZXByZWNhdGlvbiANCj4gbm90aWNlIChhbmQgbmVlZCBmb3IgdGhlIGF0dHJpYnV0ZSkg PyINCj4NCj4gQnV0IEkgc2VlIHlvdSd2ZSBhbHJlYWR5IGFuc3dlcmVkIHRoYXQgcXVlc3Rp b24gYnkgY2hhbmdpbmcgdGhlIA0KPiBiZWhhdmlvdXIgdG8gdGhyb3cgbm93LiA7LSkNCj4N ClRoaXMgd2FzIHNvbWV0aGluZyBJIHdhcyBjb25mdXNlZCBieSBhcyB3ZWxsIGJ1dCB3YXNu J3Qgc3VyZSBhdCBhbGwgaWYgDQp0aGlzIHdvdWxkIGFjdHVhbGx5IGJlIGFuIGlzc3VlIGlu IGEgcmVhbCB3b3JsZC4gU28gSSB0cmllZCB0byBjb21lIHVwIA0Kd2l0aCBhIHJlYWwgd29y bGQgZXhhbXBsZS4NCg0KSWYgSSB1bmRlcnN0YW5kIGNvcnJlY3RseSB5b3UgYWxyZWFkeSBj aGFuZ2VkIHRoZSBiZWhhdmlvciB0byB0aHJvdyBub3cgDQpidXQgSSBzdGlsbCB3YW50IHRv IHNoYXJlIGFueXdheSAuLi4uDQoNCkltYWdpbmcsIGFzIGxpYnJhcnkgYXV0aG9yLCB5b3Ug aGF2ZSBhIHByb3BlcnR5IHdpdGggaG9va3MgdGhhdCBjb250YWluIA0KYSB0eXBvIGFuZCB5 b3Ugd2FudCB0byByZW5hbWUgaXQgaW4gYSBCQyB3YXkuIExldCdzIHNheSB5b3Ugd2FudCB0 byANCnJlbmFtZSAib2xkUHJvcCIgdG8gIm5ld1Byb3AiIGJ1dCBib3RoIHNob3VsZCB3b3Jr IHRoZSBzYW1lIGFzIGlmIGl0IA0Kd291bGQgYmUgdGhlIHNhbWUgcHJvcGVydHkuDQoNCmNs YXNzIFRlc3Qgew0KIMKgwqDCoCBjb25zdCBQUkVGSVggPSAnYmFja2VkOic7DQoNCiDCoMKg wqAgcHVibGljIHN0cmluZyAkbmV3UHJvcCB7DQogwqDCoMKgwqDCoMKgwqAgc2V0ID0+ICR0 aGlzLT5wcmVmaXhpemUoJHZhbHVlKTsNCiDCoMKgwqDCoMKgwqDCoCBnZXQgPT4gJHRoaXMt PmdldFByb3AoKTsNCiDCoMKgwqAgfQ0KDQogwqDCoMKgIHB1YmxpYyBzdHJpbmcgJG9sZFBy b3Agew0KIMKgwqDCoMKgwqDCoMKgIHNldCB7DQogwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAk dGhpcy0+bmV3UHJvcCA9ICR2YWx1ZTsNCiDCoMKgwqDCoMKgwqDCoCB9DQogwqDCoMKgwqDC oMKgwqAgZ2V0ID0+ICR0aGlzLT5nZXRQcm9wKCk7DQogwqDCoMKgIH0NCg0KIMKgwqDCoCAv KiogQ29tcGxleCB2YWx1ZSB0cmFuc2Zvcm1lciAqLw0KIMKgwqDCoMKgcHJpdmF0ZSBmdW5j dGlvbiBwcmVmaXhpemUoJHZhbHVlKSB7DQogwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHNlbGY6 OlBSRUZJWCAuICR2YWx1ZTsNCiDCoMKgwqAgfQ0KDQogwqDCoMKgIC8qKiBDb21wbGV4IHZh bHVlIHJldmVyc2UgdHJhbnNmb3JtZXIgKi8NCiDCoMKgwqDCoHByaXZhdGUgZnVuY3Rpb24g dW5wcmVmaXhpemUoJHByZWZpeGVkKSB7DQogwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHN1YnN0 cigkcHJlZml4ZWQsIHN0cmxlbihzZWxmOjpQUkVGSVgpKTsNCiDCoMKgwqAgfQ0KDQogwqDC oMKgIHByaXZhdGUgZnVuY3Rpb24gZ2V0UHJvcCgpIHsNCiDCoMKgwqDCoMKgwqDCoCByZXR1 cm4gJHRoaXMtPnVucHJlZml4aXplKCR0aGlzLT5uZXdQcm9wKTsNCiDCoMKgwqAgfQ0KfQ0K DQokdCA9IG5ldyBUZXN0KCk7DQokdC0+bmV3UHJvcCA9ICdmb28nOw0KdmFyX2R1bXAoJHQp OyAvLyBvYmplY3QoVGVzdCkjMSAoMSkgeyBbIm5ld1Byb3AiXT0+IHN0cmluZygxMCkgDQoi YmFja2VkOmZvbyIgfQ0KdmFyX2R1bXAoJHQtPm5ld1Byb3ApOyAvLyBzdHJpbmcoMykgImZv byINCnZhcl9kdW1wKCR0LT5vbGRQcm9wKTsgLy8gc3RyaW5nKDApICIiDQoNCiR0LT5vbGRQ cm9wID0gJ2Jhcic7DQp2YXJfZHVtcCgkdCk7IC8vIHsgWyJuZXdQcm9wIl09PiBzdHJpbmco MTApICJiYWNrZWQ6YmFyIiB9DQp2YXJfZHVtcCgkdC0+bmV3UHJvcCk7IC8vIHN0cmluZygz KSAiYmFyIg0KdmFyX2R1bXAoJHQtPm9sZFByb3ApOyAvLyBzdHJpbmcoMCkgIiINCg0KDQpL aW5kIHJlZ2FyZHMsDQpNYXJjDQo= --------------oag0GTm3IaABhW035AEGcVz4 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

Hi,

On 12.04.24 04:55, Juliette Reinders Folmer wrote:
Hi Ilija,

On 12-4-2024 1:00, Ilija Tovilo wrote:
<snip>

Oh, and hang on, they *can* be read from a metho=
d in the same class as long as that method is called from within the set =
hook, so now the method will need to either do a backtrace or use Reflect=
ion to figure out whether it has access to the property value.
Right. We use the same mechanism as `__get`/`__set=
` uses to protect
against recursion. In particular, when entering a magic method for a
particular property, PHP remembers this using a "property guard". It's
really just a marker in the object that sets the magic method type,
along with the property name.

When the same property is accessed again, the magic method or hook is
skipped, and PHP behaves as if the magic method or hook wasn't there
at all. For `__get`, `__set` and hooks of virtual properties, this
means accessing a dynamic property. For backed properties, this means
accessing its backing value.

After discussing it, we've decided to make virtual properties slightly
less surprising by throwing, instead of trying to create a dynamic
property. This would be consistent with how virtual read-, and
write-only properties are handled outside of hooks, when they are
written to or read, respectively.

Forgive me, but I had to chuckle at the mention of virtual properties needing to access a dynamic property in the context of a property guard.
My thoughts went straight to the following question "Does this mean that support for dynamic properties could never be removed if this RFC gets voted in ? And if so, can we please get rid of the deprecation notice (and need for the attribute) ?"

But I see you've already answered that question by changing the behaviour to throw now. ;-)

This was something I was confused by as well but wasn't sure at all if this would actually be an issue in a real world. So I tried to come up with a real world example.

If I understand correctly you already changed the behavior to throw now but I still want to share anyway ....

Imaging, as library author, you have a property with hooks that contain a typo and you want to rename it in a BC way. Let's say you want to rename "oldProp" to "newProp" but both should work the same as if it would be the same property.

class Test {
=C2=A0=C2=A0=C2=A0 const PREFIX =3D 'backed:';

=C2=A0=C2=A0=C2=A0 public string $newProp {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 set =3D> $this->pr= efixize($value);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 get =3D> $this->ge= tProp();
=C2=A0=C2=A0=C2=A0 }

=C2=A0=C2=A0=C2=A0 public string $oldProp {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 set {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 = $this->newProp =3D $value;
=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 get =3D> $this->ge= tProp();
=C2=A0=C2=A0=C2=A0 }

=C2=A0=C2=A0=C2=A0 /** Complex value transformer */
=C2=A0=C2=A0=C2=A0=C2=A0private function prefixize($value) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return self::PREFIX . $v= alue;
=C2=A0=C2=A0=C2=A0 }

=C2=A0=C2=A0=C2=A0 /** Complex value reverse transformer */
=C2=A0=C2=A0=C2=A0=C2=A0private function unprefixize($prefixed) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return substr($prefixed,= strlen(self::PREFIX));
=C2=A0=C2=A0=C2=A0 }

=C2=A0=C2=A0=C2=A0 private function getProp() {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return $this->unprefi= xize($this->newProp);
=C2=A0=C2=A0=C2=A0 }
}

$t =3D new Test();
$t->newProp =3D 'foo';
var_dump($t); // object(Test)#1 (1) { ["newProp"]=3D> string(10)= "backed:foo" }
var_dump($t->newProp); // string(3) "foo"
var_dump($t->oldProp); // string(0) ""

$t->oldProp =3D 'bar';
var_dump($t); // { ["newProp"]=3D> string(10) "backed:bar" }
= var_dump($t->newProp); // string(3) "bar"
var_dump($t->oldProp); // string(0) ""


Kind regards,
Marc --------------oag0GTm3IaABhW035AEGcVz4-- --------------DXRc4m358Y5vIyqIpP3GMb32 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----- --------------DXRc4m358Y5vIyqIpP3GMb32-- --------------3uH3uWOyfuZ8JdNxih0YMB2O-- --------------gEoOvp2zQHoa40z0teJKYUAm Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature.asc" -----BEGIN PGP SIGNATURE----- wsB5BAABCAAjFiEENJIbKB0SAX2RmUKbOTar91O8iM4FAmYY4tgFAwAAAAAACgkQOTar91O8iM4u Pwf/Z2rnYpKTpcFJAqAXCSltMgu0sQnYrRGCLDV+fib89dZ+RytYLefrt+islzA8RlfCO4KNugES MEYC/qdcdcA90xPoteCXGEgCN17841K5bm7Nks3XJwiH/RuPecdfKAykWz21bVln1NWx2R+4fYNo 3IEsg3pSpKeG3WMOQ8+bmizB4EwqG9tyHDzmycQu7I8d6IGSS2X90/lijaqy4uwE1jeVi8K9t2w9 dZXCz0UQ3Bdy/VIfMbe7P4GN3d9qWdZQ00/ZEgOSOApzGjtZ/kpnMFpLc32V2YDsD+NRl33y5dhm xPQIXXpf1P6TZsUZHu9TDygCBqW5IxhaCNyFuamRow== =JLxz -----END PGP SIGNATURE----- --------------gEoOvp2zQHoa40z0teJKYUAm--