Re: [RFC] Variable syntax tweaks
| From: | Nikita Popov | Date: | Fri, 17 Jan 2020 13:20:58 +0000 |
| Subject: | Re: [RFC] Variable syntax tweaks | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-108179@lists.php.net to get a copy of this message | ||
On Thu, Jan 16, 2020 at 10:12 AM Claude Pache <claude.pache@gmail.com>
wrote:
>
>
> > Le 7 janv. 2020 à 11:23, Nikita Popov <nikita.ppv@gmail.com> a écrit :
> >
> > Hi internals,
> >
> > I'd like to propose a small RFC, which addresses a few minor issues that
> > have not been handled by the original "uniform variable syntax" RFC:
> >
> > https://wiki.php.net/rfc/variable_syntax_tweaks
> >
> > This is all about edge cases of edge cases, of course. I think the only
> > part here that is not entirely straightforward and may need some
> discussion
> > is how arbitrary expression support for instanceof should be handled.
> >
> > Regards,
> > Nikita
>
> Hi,
>
> The RFC looks good for me, except for one point. Concerning the arbitrary
> expression support for
new and
> instanceof, I strongly think that the
> most consistant choice for delimiters among “(...)” (parentheses) and
> “{...}” (braces) is not braces “{...}”, but parentheses “(...)”. Your
> argument is based on the position of the expression (RHS vs LHS). My
> argument is based on the type (in a broad sense) of the thing that the
> expression is supposed to represent.
>
> The braces are used when the expression is expected to represent:
>
> * a variable name: ${...}
> * a property name: $x->{...} —
> X::${...}
> * a method name: $x->{...}() —
> X::{...}()
>
> In all those cases, the expression inside {...} must evaluate
> to a
> string, and will be interpreted as a name.
>
> On the other hand, the parentheses are used when the expression is
> expected to represent:
>
> * an array: (...)["key"]
> * an object: (...)->prop —
> (....)->meth() — clone (....)
> * a function: (...)($arg)
> * a class: (...)::KONST —
> (...)::${statProp} —
> (...)::${statMeth}()
>
> In the first two cases, the expected entity, “array” or “object”, is a
> first-class value, and the expression inside (...) will be
> interpreted as
> such.
>
> The last two cases are more interesting. For the ”function” cases, it can
> be:
> * a string representing a function (interpreted as the fully qualified
> name of a function);
> * an array [ $obj, "meth" ], [
> "klass", "meth" ] or a string
> "klass::meth" representing a method;
> * a closure or another object implementing the magic __invoke() method.
>
> For the “class” case, it can be:
> * a string representing a class (interpreted as the fully qualified name
> of a class);
> * an instance of a class.
>
> In those cases, the expected entity may be a first-class citizen (a
> closure, an instance of a class), or an entity that, although not a
> first-class citizen, is unambiguously(*) represented by some other
> first-class value (a function by their fully qualified name, etc.) and
> could have been reasonably designed as first-class citizen (and indeed, a
> function may be replaced with a Closure object with the same functionality).
>
> (*) (For the sake of not complicating the argument, I’m ignoring callables
> whose meaning depends on context such as ["self",
> "foo"].)
>
> You rightly noted that the braces {...} are used exclusively on
> the RHS;
> that follows from their meaning: a bare name has no significance out of
> context, where the context is whether it is a function name, or whether it
> is a property/method name and of which object/class the property/method is,
> or etc. That context is more naturally provided before (at the left of) the
> name.
>
> On the other hand the parentheses (...) are often used on the
> LHS: this
> place is the natural place for an entity (an object, a class, etc.) that
> don’t need more context to be well-defined, and that serves as target for
> some action (call the function, look up the property of an object, etc.)
> However, although the entity is often placed at LHS, this is not
> systematic; consider f.e. clone $obj, which is quite similar to
> `new
> klass`.
>
Thanks for the feedback Claude.
I think you make a compelling case, and have updated the RFC to use "new
(expr)" and "$x instanceof (expr)" syntax instead.
Regards,
Nikita