@Rasmus

We are not changing behaviour of operators since we are not dealing here
just with Value Objects.
It's not even a question that matter of this RFC can be achieved with
encapsulation. Already there are couple of features that got passed, which
also could be achieved without 'syntax' sugar, so I don't think that is a
valid argument, but I'm not going to into any of that, since it would not
result in any constructive argument.

I do have to apologize for still incomplete RFC. Your question regarding if
you declare property immutable and put 'non' immutable object  there has
been addressed from beginning.

And also regarding getters, I really see them as a neccesary evil, the more
internal state you expose, the more you have to test since that's you
contract to the rest of application and etc.

Cheers,
Silvio.

2016-11-21 9:46 GMT+01:00 Mathieu Rochette <math...@rochette.cc>:

>
>
> On 20/11/2016 20:25, Rasmus Schultz wrote:
>
>> Reading through the RFC and the replies, I'm confused about this question.
>>
>> Why would the comparison operators work any differently on immutable
>> objects?
>>
>> If these were value objects, the question would make sense, but it doesn't
>> sound like that's what you're proposing?
>>
>> With regards to the feature itself, I frankly don't feel like it makes any
>> sense. I disagree with the entire premise of the RFC.
>>
>> Currently PHP lacks native support for immutability.
>>>
>> No, it doesn't. You show several examples of immutable classes in the RFC,
>> then demonstrate a slightly more abbreviated syntax to accomplish the same
>> thing.
>>
>> Because of that user-land applications are using third party libraries or
>>>
>> resort to custom implementations and still there is no easy enforcement of
>> immutability.
>>
>> Really? There are third-party libraries for immutable classes? .... Why?
>>
>> It's true that there is no way for a class, internally, to enforce
>> immutability on itself - but why would you need to do that? You're writing
>> the class. If you want immutable state inside your class, simply don't
>> change the state.
>>
>> Why would you need the language to enforce rules that you can already
>> enforce with the language?
>>
> The two main reasons I can think of are: I want the language to help me
> (ie: sometime we make mistakes) & I want classes implementing that
> interface to be immutable (eg: PSR7)
>
>
>> Introducing this feature would help bring one unified solution to this
>>>
>> problem, and also it would remove unnecessary logic from user-land
>> applications.
>>
>> What is this unnecessary logic you're referring to? Get-methods generally
>> do not contain logic. There is no more or less logic in the examples you
>> show in your before/after code samples.
>>
>> Perhaps you mean boilerplate? So yes, this feature removes a little bit of
>> boilerplate. Writing immutable classes becomes a little less ceremonious.
>>
>> I think that the problem of writing get-methods is exaggerated and
>> somewhat
>> contrived.
>>
>> This feature doesn't enable you to do something you couldn't do before -
>> it
>> obviates the need to write get-methods, but that's basically all, and I'm
>> not even convinced that's a good thing.
>>
>> Public properties, in practice, are almost never used in PHP code. You
>> very
>> rarely see anybody use them, because they're not generally safe, e.g.
>> permits client code to inject values of the wrong type, etc.
>>
>> What you're proposing will make public properties the default for
>> immutable
>> objects.
>>
>> This will lead to inconsistencies - for example:
>>
>> immutable class Name {
>>      public $first;
>>      public $last;
>>      public function getFullName() {
>>          return "{$this->first} {$this->last}";
>>      }
>> }
>>
>> This will get confusing quickly - you will have to learn or memorize which
>> attributes of your model are available as properties or methods, e.g.
>> $name->first is pretty far removed from $name->getFullName() both in terms
>> of syntax and style.
>>
>> I think this will become quite confusing in practice, as nobody currently
>> expects or looks for public properties.
>>
>> Also, having to refactor from a get-method to a public property, or
>> vice-versa, becomes a chore that causes a breaking change.
>>
> you don't have to move from getters to public properties. It's not needed
> as a "security" point a view, but I think most will still use getter to
> access the object values. It's especially true if you are implementing
> interfaces (or immutable interfaces). from the rfc : "Notice in above
> examples removing getters and setting properties to public is optional.
> They simply doesn't need to be protected anymore in fact that immutable
> class objects are deeply frozen with eceptions on write."
>
>>
>> The term 'immutable", especially for the property-annotation, doesn't
>> strictly seem correct to me either, as for example, I can annotate a
>> public
>> property as immutable, but if I put an object in there, that object is not
>> necessarily immutable. The correct term for this feature, especially for
>> properties, I would think is "readonly" - which would be consistent with
>> the description of certain existing properties in PHP APIs, such as
>> PDOStatement::$queryString, as well as with other languages such as C#.
>>
> I'm not sure about that one because I can't find it explicitly in the rfc
> (maybe it need to be added ?) but I think immutable properties only accept
> immutable scalar or objects. otherwise you're right, it would not be
> immutable
>
>
>> Either way, this feature proposes to introduce "asynchronous" properties
>> as
>> a new concept in PHP, where properties are generally "synchronous", in the
>> sense that they can always be read and written. Other languages that
>> support asynchronous properties (C#, Objective-C, Dart, probably many
>> others) typically leverage that concept for more than just simple
>> immutability - the concept of properties that behave differently when you
>> attempt to read and write is not typically a mere annotation/directive
>> instructing the compiler to enforce a rule, it's typically made possible
>> via support for accessors.
>>
>> This might limit future options for the language, perhaps depending on how
>> it's implemented.
>>
>> I hope it doesn't mean we can't have accessors at some point, in the
>> distant future.
>>
>> In my opinion, all of these things go hand-in-hand: accessors, read-only,
>> property type-hints, as these are all essentially about defining and
>> enforcing constraints and making assertions about the state of a model.
>>
>> I feel that this feature is a poor substitute for accessors, for example,
>> because this feature really applies only to immutable models - whereas a
>> feature such as accessors could be used equally to create immutable
>> models,
>> but would permit us to move away from get/set-methods entirely, e.g. would
>> allow to write models with more consistent APIs, for example something
>> like:
>>
>> class Name {
>>      public readonly $first;
>>      public readonly $last;
>>      public $full_name {
>>          get { return "{$this->first} {$this->last}"; }
>>      }
>> }
>>
>> Something like that makes for more consistent client code, e.g.
>> $name->first and $name->full_name, etc.
>>
>> I'd like to see us adding features that work everywhere, for many
>> use-cases, mutable and immutable - introducing a language feature that
>> works only for immutable objects just feels to exotic to me, in a language
>> that is mutable by default.
>>
>> I'd prefer to see features with broader applications.
>>
>>
>> On Wed, Nov 16, 2016 at 2:57 PM, Silvio Marijić <marijic.sil...@gmail.com
>> >
>> wrote:
>>
>> Hi,
>>>
>>> To anyone who is interested in this RFC. What do you think what behavour
>>> we
>>> should have when you try to compare two immutable objects by identity
>>> like
>>> this:
>>>
>>> immutable class A {
>>>
>>> public $a;
>>>
>>> public function __construct($a) {
>>>     $this->a = $a
>>>      }
>>>
>>> }
>>>
>>> $a1 = new A(1);
>>> $a2 = new A(1);
>>>
>>> $a1 === $a2
>>>
>>> If we treat those objects as values then this should return true. But
>>> then
>>> again there might be some confusion because then two operators are doing
>>> the same thing. Maybe throw an error ? Suggestions ?
>>>
>>> Cheers.
>>> --
>>> Silvio Marijić
>>> Software Engineer
>>> 2e Systems
>>>
>>>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>


-- 
Silvio Marijić
Software Engineer
2e Systems

Reply via email to