Re: Wired constant expression syntax and bug
| From: | Dmitry Stogov | Date: | Tue, 01 Jul 2014 05:48:18 +0000 |
| Subject: | Re: Wired constant expression syntax and bug | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-75158@lists.php.net to get a copy of this message | ||
On Tue, Jul 1, 2014 at 1:05 AM, Andrea Faulds <ajf@ajf.me> wrote:
>
> On 30 Jun 2014, at 20:06, Dmitry Stogov <dmitry@zend.com> wrote:
>
> > Hi Bob,
> >
> > I'm wondered why you introduced this wired syntax in PHP-5.6.
>
> Do you mean weird?
>
yes :) sorry
>
> >
> > class FooBar {
> > const bar = ["bar" => 3]["bar"];
> > }
> >
> > It wasn't a part of RFC, it wasn't covered by tests, and it actually
> > doesn't make a lot of sense. May be it's better to remove it?
>
> I disagree, it makes perfect sense:
>
> class FooBar {
> const FOO = 3;
> const BAR = [
> 3 => ‘qux’,
> 4 => ‘bang’,
> 7 => ‘theta’,
> 9 => ‘epsilon’
> ][FOO];
> }
>
> ?: and ? only work when there are just two possibilities.
>
?: may work with brackets, but I have to admit that it's less readable.
class Foo {
const X = 2;
const Y = (Foo::X == 0 ? 1 :
(Foo::X == 1 ? 2 :
(Foo::X == 2 ? 3 :
(Foo::X == 3 ? 4 :
5))));
}
The situation is really inconsistent because we allow expressions on
constant arrays but at the same time prohibit array usage.
Look into the following scripts:
<?php
class Foo {
const BAR = [
3 => ‘qux’,
4 => ‘bang’,
7 => ‘theta’,
9 => ‘epsilon’
][1];
}
var_dump(Foo::BAR); // works - prints 'bang'
?>
<?php
class Foo {
const BAR = [
3 => ‘qux’,
4 => ‘bang’,
7 => ‘theta’,
9 => ‘epsilon’
];
}
var_dump(Foo::BAR); // doesn't work - Fatal error: Arrays are not allowed
in constants at run-time
?>
<?php
class Foo {
const BAR = [
3 => ‘qux’,
4 => ‘bang’,
7 => ‘theta’,
9 => ‘epsilon’
];
}
// This works again! We may declare array class constants if we don't use
them?
?>
Where is the logic?
Thanks. Dmitry.
>
> It is surprising that it wasn’t in the RFC though, I suspect that was just
> an oversight on Bob’s part.
> --
> Andrea Faulds
> http://ajf.me/
>
>
>
>
>