(I should have reviewed myself in the first message - sentences edited in
this reply)

Le lun. 28 janv. 2019 à 08:58, Marco Pivetta <ocram...@gmail.com> a écrit :

> On Sun, Jan 27, 2019 at 5:37 PM Nicolas Grekas <
> nicolas.grekas+...@gmail.com> wrote:
>
>> Le jeu. 24 janv. 2019 à 15:18, Sebastian Bergmann <sebast...@php.net> a
>> écrit :
>>
>> > Am 24.01.2019 um 15:09 schrieb Marco Pivetta:
>> > > Not really fussed about having another implicit interface for
>> > serialization
>> > > (via magic methods).
>> >
>> > I second that emotion.
>> >
>>
>>
>> The more I think about it, the more I'm convinced we should *not* add an
>> interface for that.
>> An interface defines a semantics - an API to a domain - and
>> that ppl can type-hint for to get a specific implementation of that
>> API.
>
>
> An interface declares an API surface for an object: in this case, the
> consumer would be `serialize()` or `unserialize()`, and that's a perfectly
> valid use-case scenario.
>

Implemeting serialize/unserialize methods is meant to hook into the
same-name functions.
That's a very technical and concrete thing - a behavior - not anything
abstract as an interface is.


Here, both aspects are not desired: we don't want ppl to type-hint for
>> e.g. Serializable - and too bad it exists because I've already seen ppl
>> think: "hey, I'll type-hint or extend it to express I want a serializable
>> thing".
>
>
> That's actually a very correct thing to do: by declaring that something is
> `Serializable`, you are expressing your intent to anybody inspecting the
> structure of the object.
>

"intent" is the issue here: these is no such abstract thing here. The PHP
engine is a very concrete object that provides behaviors to userland. And
we need a proper hook to configure the behavior of the
serialize/unserialize functions. There is no such things as
interface/intent/abstraction here, just a hook and that's perfect because
the engine should define as little semantics as possible: that's the job of
userland!


BUT that's *not* the contract of Serializable or any variant of it
>> because: 1. *any* PHP object is serializable 2. Serializable it well
>> allowed to throw an exception to exactly *forbid* an object from being
>> serialized.
>>
>
> That's a completely different problem, which is that PHP has no way to
> declare APIs as functionally pure, or exception-less. That's something to
> be explored, in my opinion, but the lack of it does not warrant dismissing
> interfaces altogether (your current argument).
>

You completly ignored 1.: *any* object is serializable. Another hint there
isn't any abstraction sitting here: if Serializable was one, it would be
like a small wall in wide field.

The only way we could make "Serializable2" an abstraction is by fordbidding
any object that *does not* impementit to be serializable. That's
unrealistic - and uneeded to me.


> Serializability is something to be declared: currently, PHP is very much
> ill-designed on this particular scope, but that doesn't mean that we should
> make it even worse.
>
> From this reasoning, I conclude that we really want magic methods here
>> because what we need is a *behavior*. We want to hook into the engine to
>> benefit from some special features it provides. That's what all magic
>> methods are about and hooking into serialize()/unserialize() is not
>> different.
>>
>
> Yet more magic methods just add an impressive amount of complexity to the
> language (I'm already thinking of the permutations of edge cases that I'm
> personally going to have to write).
>

Please do, I'd be happy to better understand your pov.

It's yet another way to define something that would work correctly if an
> interface (existing mechanism defined by the language) was used instead.
>

It would not abstract anything, thus would be just broken syntactic
illusional sugar.

Magic methods would just provide that, without polluting the semantics
>> space.
>>
>
> The newly introduced magic methods pollute the entire **language
> semantics**: now you have another edge case in the language, instead of an
> interface that works in combination with the `serialize()` and
> `unserialize()` functions.
>

"Language semantics" is another thing. I'm talking about "domain
semantics". See reasoning above :)

I'll also add that the problem being solved is much smaller than the issues
> introduced by the
>
proposed additions.
>

I promise the contrary: my personal experience is that Serializable does
real harm (please work on https://github.com/symfony/symfony/issues/29951
and related issues to get the feeling).
Magic methods would solve all this crap.

Cheers,
Nicolas

Reply via email to