> On Sep 16, 2019, at 6:20 PM, Larry Garfield <la...@garfieldtech.com> wrote:
> 
> I think everyone's in agreement about:
> 
> 1) Making objects easier to work with.
> 2) Devs should use objects more.

I am glad we are reaching some common ground. :-)

> (Side note: I have an article submitted to php[architect] entitled "Never* 
> use arrays" that goes into this topic in much more detail.  I am 100% on 
> board with getting developers using objects more and arrays less.)

Yes, I saw the article on your blog that you linked. Very nice. :-)

> However, why do we want devs to use objects more?  If we just want the 
> arrow-like syntax, then this works today:
> 
> $val = (object)[
>  'foo' => 'bar',
>  'baz' => 5,
> ];
> 
> And now developers are using an anonymous "object".  However, that offers 
> basically no meaningful improvement except funnier passing semantics.
> ...

> 2) They're more self-documenting and statically analyzable (by your IDE or 
> any other tool)... but that's true only if you have an explicitly defined 
> class!
> ...
> So for me, the entire "easier to use anonymous one-off classes" argument 
> falls apart, because there's no material benefit there other than saying "but 
> now it's using objects".  For that, as noted, we already have an ample syntax 
> that accomplishes just as much.


I can envision several benefits you do not mention, maybe because you've 
forgotten them, were not aware of them, or they did not occur to you?

In descending order of significance:

1. IDEs could validate local uses for stdClasses — Given the following syntax, 
PhpStorm could and likely would implement an inspection that displayed a 
warning on the line with $val->bazoom because everything it needs to validate 
is there.  And I see no reason other IDEs could not do the same:

$val = stdClass{
    foo => 'bar',
    baz => 5,
};
echo $val->bazoom;

2. Empowering beginners — If you are a beginner, or a work-to-live[1] 
programmer then I think there is a good chance you will find the syntax 
(object)[..] foreign and confusing.  I think they would find the following 
syntax easier to tackle and thus more likely to use, especially if they came 
from Javascript (note I omitted stdClass in hopes we could land on using such 
syntax for stdClass or anonymous classes):

$val = {
    foo => 'bar',
    baz => 5,
};

By empowering beginners they would be more likely to objects they can later 
refactor instead of arrays (see #5 below.)

3. Simplifying refactoring — It will be easier to refactor an object 
initializer for stdClass to a declared class than to refactor from the hybrid 
array/object syntax.

4. Simplified syntax — I tend to make a lot more typos when initializing array 
keys in PHP than I do when initializing objects in GoLang (the proposed PHP 
syntax is very similar to the equivalent in Go.)  Maybe I am unique in that, 
but I doubt it.  

I also find array keys with quotes harder to read (but maybe that's because I 
have 56 year old eyes instead of younger eyes that guys like you have? :-)

5. The (object)[...] syntax feels like a hack — I use that syntax, but every 
time I do I feel like I am doing something I should not be.  And I also rarely 
see that syntax being used in the wild, so maybe others feel the same?

5. PSON! — I we had an object initializer syntax, we could finally have a 
competitor to JSON; i.e. PSON!  Imagine if we had only had it 15 years ago... 
:-o

Remember, the above were in descending order of significance.

> It's only an advantage if I do this:
> 
> function doSomething(int $a, SomethingOptions $options = null) { ... }
> 
> Doing that has many advantages, I think we all agree.  But going halfway 
> doesn't give us any benefits other than swapping [' '] for ->.

Other than the assertion that it only has advantages with declared classes, I 
do generally agree this is usually the most beneficial approach.

But as I said before, naming is hard — except for abstract examples where you 
can just name it "Something" :-) — and developers often don't know what object 
schema they will need until they have written much of the code. So the ability 
to have a syntax that supports stepwise refinement rather than starting with 
one and having to switch to the other makes a lot more sense to me.  

Allowing developers to start with doSomething(int $a, object $options = null) 
and then later refine the code to doSomething(int $a, SomethingOptions $options 
= null) creates less discontinuity for development rather than giving them only 
one option for anonymous class initializer, e.g. the array initializer syntax?

> So rather than making it easier for people to make "anonymous structs that 
> use object syntax", we should be making it easier for people to define 
> for-realsies named classes and using them, because *that* is where the 
> benefit comes from.

If you can actually make it easy, I would be the first to support that. I just 
cannot envision how you can without more upfront complexity than simple object 
initializers need.  

So please, prove me wrong! :-)

> And for that part of the problem (making named struct-like classes easier to 
> work with), as noted in the other thread I find the named 
> parameters/auto-promotion combination to solve the problem just as well, and 
> then some.

There has recently been a call from several people on the list for everyone to 
try and find solutions that are not  "You loose so I can win."  

Rather than protest object initializers to enable named 
parameters/auto-promotion instead, can we not work together to find a way to 
achieve all three with one simple syntax and as few new sigils used as possible?


-Mike
[1] That phrase came from one of my ex-girlfriends. It was derisive, and aim at 
me because I liked working. And note the qualifier "ex-."


Reply via email to