Re: Wired constant expression syntax and bug

From: 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/ > > > > >

« previous php.internals (#75158) next »