This comes in thanks to my old friend Fred Emmott on the HHVM project: https://3v4l.org/vUHq3
class Foo { const A = 1 << 0; const B = self::A | self::C; const C = 1 << 1; } class Bar extends Foo { const A = 1 << 2; const C = 1 << 3; } var_dump(decbin(Bar::B)); // HHVM result: 11 // PHP5 result: 1100 // PHP7 result: 1001 HHVM's result is clearly correct as `self::` refers to the defining class and so should bind to Foo's values for A and C. PHP5's result is at least rationally viable, although it effectively redefines `self::` to the semantics of `static::` just for this case. PHP7's result is... well, I can imagine how it occurs, but it can't be called correct by any measure. Opinions on the right thing to do here? a) Leave it alone because it's been that way since 7.0 b) Revert to php5 behavior c) Match HHVM's behavior I vote C because that's the semantic meaning of self:: and we should respect PHP's own language rules. Barring that, I'd be okay with B as it's at least explainable without too much mental gymnastics. I straight up veto A. That's just cray-cray. -Sara -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php