While I understand your concern with set being the only keyword using (),
and even agree it's a bit problematic, I see a big problem with using
$value.

Even if $value internally makes sense due to something along the lines of *
__setHours($value)* {} being equal to *set {}*, I think using $value
without it ever being defined in the developer's code is not at all a good
idea.
If I see $value in the code, I'll logically look for where it was defined,
and when I don't see it anywhere else in the code, things are going to very
quickly get confusing.
Our best option to combat this confusion is, in my eyes, putting a note in
the documentation. That's not enough.

A similar alternative to using $value that I'd argue would be much more
sensible would be to, as Denis mentioned, use either a magic constant or a
superglobal.

As I mentioned previously, I would rather go with the set($value) {} syntax.

Now, back to the part where I agree with you - the inconsistency wherein
set has () that denote it is a method but get, isset, and unset do not. I
see this inconsistency as something problematic enough to warrant a
solution.

We could go with the following:
public $Hours {
  get() { ... }
  set($value) { ... }
  isset() { ... }
  unset() { ... }
}

Yes, we now have a little bit more meat on the syntax, but in this case, I
don't think that it's all that bad. Here's two reasons why:
1) Adding parenthesis denotes that they are all functions - which they are!
If anything, adding parenthesis to all of them makes the implementation *
more* sensible.
2) It's *only* two more characters per function. On top of that, in my
opinion, this syntax is not "ugly". In fact, as I just mentioned - this
implementation is arguably *more* consistent with the rest of PHP.

On Mon, Oct 8, 2012 at 6:10 PM, Clint Priest <cpri...@zerocue.com> wrote:

> Seems a fair amount of people would like it with a definable parameter
> name, though the original RFC I based mine off of is more than 4 years old
> (mine is over a year old already).
>
> The $value is precisely chosen because it is exactly the way C# operates
> and the original author thought to keep it the same as another well-known
> language (why re-invent new syntax for no reason).
>
> That being said, javascript does indeed allow it, my concern then would be
> would we have the parameterized syntax only for set() and not get, isset or
> unset?
>
> If we do have them for all of them, it's a lot of extra characters with no
> real need.
>
> I definitely favor set($value) over a magic $Hours for the $Hours
> property, but I personally see no problem with the $value, it's not magic
> it's a locally defined variable.
>
> Internally, this:
>    public $Hours {
>       get { ... }
>       set { ... }
>    }
>
> Is implemented as standard functions, while they are hidden through
> reflection, these functions exist (as a result of the above example):
>
> public __getHours() { ... }
> public __setHours($value) { ... }
>
> Lastly, with regards to JavaScript style getters/setters, I don't think
> I've ever cared what the variable name was, I typically just do something
> like:
>
> set blah(x) { ... } <-- x is fairly irrelevant and similarly the use of
> $value is fairly irrelevant.   Thoughts?
>
> > -----Original Message-----
> > From: Jazzer Dane [mailto:tbprogram...@gmail.com]
> > Sent: Monday, October 08, 2012 5:32 PM
> > To: Benjamin Eberlei
> > Cc: Aaron Holmes; internals@lists.php.net
> > Subject: Re: [PHP-DEV] [RFC] Propety Accessors v1.1
> >
> > I agree.
> > It's more consistent than the $Hours solution and we don't have to add
> another superglobal or magic constant, which is quite nice. The
> > typehinting is a big plus as well.
> >
> > On Mon, Oct 8, 2012 at 3:26 PM, Benjamin Eberlei <kont...@beberlei.de
> >wrote:
> >
> > > The set() one is really nice with the typehints.
> > >
> > > On Tue, Oct 9, 2012 at 12:19 AM, Aaron Holmes <aa...@aaronholmes.net>
> > > wrote:
> > >
> > > > On 10/8/12 1:07 PM, Denis Portnov wrote:
> > > >
> > > >> 08.10.2012 15:52, Clint Priest пишет:
> > > >>
> > > >>>      public $Hours {
> > > >>>          get { return $this->Seconds / 3600; }
> > > >>>          set { $this->Seconds = $value; }
> > > >>>          isset<http://www.php.net/isset**>  { return isset<
> > > >>> http://www.php.net/isset**>($this->Seconds); }
> > > >>>          unset<http://www.php.net/unset**>  { unset<
> > > >>> http://www.php.net/unset**>($this->Seconds); }
> > > >>>      }
> > > >>>
> > > >>
> > > >>
> > > >> Hi Clint,
> > > >>
> > > >> I've noticed some magic variable '$value' is introduced. And except
> > > >> for superglobals I guess there is no such thing in PHP, so it looks
> > > >> bit puzzling to me. I'd suggest on of the following:
> > > >>
> > > >>
> > > >> - setter resambles setter method, wich also allows typehinting
> > > >>     public $Hours {
> > > >>         set ($value) { $this->Seconds = $value * 3600; }
> > > >>     }
> > > >>
> > > >>     public $Hours {
> > > >>         set (DateTime $dateTime) { $this->Seconds =
> > > >> $dateTime->getTimestamp(); }
> > > >>     }
> > > >>
> > > >>  This seems like the cleanest method, in my opinion. Javascript
> > > >> does
> > > this
> > > > for object prototypes:
> > > > http://ejohn.org/blog/**javascript-getters-and-**setters/<
> > > http://ejohn.org/blog/javascript-getters-and-setters/>
> > > >
> > > >
> > > >>
> > > >> What do you think?
> > > >>
> > > >> Thanks
> > > >> Denis
> > > >>
> > > >>
> > > >
> > > > --
> > > > PHP Internals - PHP Runtime Development Mailing List To unsubscribe,
> > > > visit: http://www.php.net/unsub.php
> > > >
> > > >
> > >
>

Reply via email to