Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:98557 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 95678 invoked from network); 15 Mar 2017 23:33:14 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 15 Mar 2017 23:33:14 -0000 Authentication-Results: pb1.pair.com header.from=ocramius@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=ocramius@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.220.172 as permitted sender) X-PHP-List-Original-Sender: ocramius@gmail.com X-Host-Fingerprint: 209.85.220.172 mail-qk0-f172.google.com Received: from [209.85.220.172] ([209.85.220.172:36812] helo=mail-qk0-f172.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 06/36-38004-93FC9C85 for ; Wed, 15 Mar 2017 18:33:14 -0500 Received: by mail-qk0-f172.google.com with SMTP id 1so26475624qkl.3 for ; Wed, 15 Mar 2017 16:33:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=7vxZtEjDQ7Afgg1AXlHugNAXLxS0sOllaBEK62F5s0o=; b=KFPNJSpg50+RfA+LSb6kTA6cba0igurtN+RzmRAeNd2QCpTSdG5Dkw7RX1s0qHFD9/ YfzDLHv1Lw6oDOx24iL6Dy6pjoWjqsQ1NvugbT6JMxCmGiIcZkOtD3+Frn58Dqob9I0T fFEejnIcp5EOakkxHOhZoU3gbt05eT0sqBRptDMHDGLOme5KtAawLkqmlzWjuzg/etHQ Ex6f5WlOprK7YXGemqf0tj2SibeQvocu4bzbngEmdnPqK46mGz/WhaA/xJznvHcJm492 DYaqZ9mD24KUAXFcSkyulJQ7/xAk7vckWIYU5EtIjL471umsi1T11LmzJs54bfuU7v+z mC/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=7vxZtEjDQ7Afgg1AXlHugNAXLxS0sOllaBEK62F5s0o=; b=Roy0/KLTwRWFjYhonf7QAyGQw4/1AkbsA5yfTcJ8dXfyhhZ3hGCxNh9iROkhuJjEQ1 0WrqX24A6p4bhzuyX2zeSR9yNQmCOmYNe+kNiFtika4JOxtCfDSj7nCmZEHNw4Mq9b4W OpfE4NYFaJr9dVNceBsHIHP69TJ+0P1rePwxBPAOIq93tN8b4AYqZZJODSJ7HHdEsZOQ V8YHi+0QCQYHQfri9CXkPDEoa6VDY8ZJcO+md+OMEvOBYixbG95L3iAthUFg87zsU73i wCKsiT+qqpxk18EJi/whI7tcmkmdvZa+W1nvREy3kdmHT6CYE1sWTvnulrgz3suvZQsN T8vg== X-Gm-Message-State: AFeK/H0DT/daophOpsM/blOUANhWCtHryrI43C+XvjzRjQSVY1uAZIH0be9vbsHKvS9g3gZLqxmBoEEVjikCZA== X-Received: by 10.55.42.88 with SMTP id q85mr5729590qkh.135.1489620791354; Wed, 15 Mar 2017 16:33:11 -0700 (PDT) MIME-Version: 1.0 Received: by 10.237.44.70 with HTTP; Wed, 15 Mar 2017 16:33:10 -0700 (PDT) Received: by 10.237.44.70 with HTTP; Wed, 15 Mar 2017 16:33:10 -0700 (PDT) In-Reply-To: References: Date: Thu, 16 Mar 2017 00:33:10 +0100 Message-ID: To: Ryan Pallas Cc: =?UTF-8?Q?Beno=C3=AEt_Burnichon?= , Kalle Sommer Nielsen , internals@lists.php.net Content-Type: multipart/alternative; boundary=001a114961cc1e99f2054acd5eab Subject: Re: [PHP-DEV] Add __toArray() method to objects that would be called on cast to array From: ocramius@gmail.com (Marco Pivetta) --001a114961cc1e99f2054acd5eab Content-Type: text/plain; charset=UTF-8 Correct: passing an object that implements `__toArray()` to an API that uses an `(array)` cast internally will break or misbehave, if this feature is added to the language. On 16 Mar 2017 12:27 a.m., "Ryan Pallas" wrote: > > > On Mar 15, 2017 5:03 PM, "Marco Pivetta" wrote: > > Hi Ryan, > > I'm top-posting because I'm writing from a phone. I always do and I also > stopped caring for top-posters myself because it's fairly normal, plus > modern email clients deal with it. If I can write a damn mail from a phone > keyboard because I don't have any better right now, then you can probably > use the scroll wheel once on your pc too. > > I'll just say this: I'm also on a mobile device. Don't make assumptions. > > > The BC break applies to API that accepts `object` (any object). Such API > is common in library code in frameworks, data-mappers, etc. > > Such code would not work anymore for cases where the magic method is > implemented, adding either exceptions (forcing a library-level BC break) or > simply by causing the existing stable versions of these libs to be > incompatible with newer php versions. > > > I must misunderstand what constitutes an BC break. I thought a BC break > was when identical code produced different results. But you're saying its a > break because someone could change their code to use a new feature and > break their use of your library? > > > > > On 15 Mar 2017 11:57 p.m., "Ryan Pallas" wrote: > > > > On Mar 15, 2017 16:40, "Marco Pivetta" wrote: > > Which is precisely the BC break: such a library would now throw an > exception "unsupported class X" when `__toString` is implemented. Also, > such a library would break silently when this feature is implemented. > > Much like the already very broken `__debugInfo()`, this automatic > type-cast is a giga-Joule footgun. > > > First please stop top posting. > > Second bc means that if no code changes no functionality is changed. > That's exactly what we're talking about. If the class doesn't change > neither does the functionality. So unless classes already have __toArray > they will not change in behaviour. > > As pointed out in answer to my question earlier a class with no code > change would see no change in casting behaviour. Only if new method is > implemented will behaviour change. How does that not maintain bc? > > > On 15 Mar 2017 11:36 p.m., "Ryan Pallas" wrote: > >> >> >> On Wed, Mar 15, 2017 at 4:33 PM, Marco Pivetta >> wrote: >> >>> It's the only way to distinguish between set and unset properties. Also >>> the >>> only way to get all properties from an instance of an inheritance tree. >> >> Also, it's covered by tests that were explicitly added to prevent >>> regressions on this. >>> >>> Same as all similar discussions before this one: need an alternative way >>> to >>> do things before proposing a BC break. >>> >>> >> As mentioned in previous mails - the intent isn't to change existing >> behaviour, but to provide a way for a class to override the default >> behaviour. As long as those classes you are casting to array don't >> implement __toArray they will behave exactly as they always have. The only >> concern then, is that you might be relying on a library to not implement >> that function on a class you are casting. >> >> >>> On 15 Mar 2017 11:27 p.m., "Kalle Sommer Nielsen" wrote: >>> >>> > Hi >>> > >>> > 2017-03-15 21:41 GMT+01:00 Marco Pivetta : >>> > > This is a BC break due to the fact that the `(array)` cast is used to >>> > > extract property information from private properties in library code. >>> >> > >>> > Yep, but then again that is more of an >>> > undocumented-not-really-supported case afair, if anything then >>> > Reflection should have the APIs to officially allow that, although I >>> > am still skeptic of this. >>> >> Does it not through get properties? > > > >>> > >>> > -- >>> > regards, >>> > >>> > Kalle Sommer Nielsen >>> > kalle@php.net >>> > >>> >> >> > > > --001a114961cc1e99f2054acd5eab--