com php-langspec: Add the accepted RFC: class constant visibility to spec: spec/14-classes.md spec/15-interfaces.md spec/19-grammar.md tests/classes/visibility.phpt tests/constants/constants.phpt tests/interfaces/interfaces.phpt
[email protected] (Nikita Popov) Mon, 11 Jul 2016 16:43:44 +0000
| Newsgroups | php.standards.cvs |
|---|---|
| Message-ID | <[email protected]> |
Commit: 2d5cc6f08c3cd3abfcc718f42c9341939d8c91f5 Author: Reeze Xia <[email protected]> Sat, 27 Feb 2016 18:41:13 +0800 Committer: Nikita Popov <[email protected]> Mon, 11 Jul 2016 18:43:44 +0200 Parents: f75930f6f08b1ec21cf3a16872f8c17b961f1062 Branches: master Link: http://git.php.net/?p=php-langspec.git;a=commitdiff;h=2d5cc6f08c3cd3abfcc718f42c9341939d8c91f5 Log: Add the accepted RFC: class constant visibility to spec RFC: https://wiki.php.net/rfc/class_const_visibility Changed paths: M spec/14-classes.md M spec/15-interfaces.md M spec/19-grammar.md M tests/classes/visibility.phpt M tests/constants/constants.phpt M tests/interfaces/interfaces.phpt Diff: diff --git a/spec/14-classes.md b/spec/14-classes.md index 9501915..443b713 100644 --- a/spec/14-classes.md +++ b/spec/14-classes.md @@ -203,7 +203,7 @@ class MyList implements MyCollection <i>class-member-declarations class-member-declaration</i> <i>class-member-declaration:</i> - <i>const-declaration</i> + <i>class-const-declaration</i> <i>property-declaration</i> <i>method-declaration</i> <i>constructor-declaration</i> @@ -213,7 +213,7 @@ class MyList implements MyCollection **Defined elsewhere** -* [*const-declaration*](#constants) +* [*class-const-declaration*](#constants) * [*property-declaration*](#properties) * [*method-declaration*](#methods) * [*constructor-declaration*](#constructors) @@ -387,28 +387,32 @@ Widget::__callStatic('sMethod', array(NULL, 1.234)) <pre> <i>const-declaration:</i> const <i>name</i> = <i>constant-expression</i> ; + + <i>class-const-declaration:</i> + <i>visibility-modifier<sub>opt</sub></i> const <i>name</i> = <i>constant-expression</i> ; </pre> **Defined elsewhere** * [*name*](09-lexical-structure.md#names) * [*constant-expression*](10-expressions.md#constant-expressions) +* [*visibility-modifier*](#properties) **Constraints:** -A *const-declaration* must only appear at the top level of a script, be -a *class constant* (inside a [*class-definition*](#class-members) or be an -[*interface constant*](15-interfaces.md#interface-members). +A *const-declaration* must only appear at the top level of a script, and +must not redefine an existing [c-constant](06-constants.md#general). -A *const-declaration* must not redefine an existing [c-constant](06-constants.md#general). +A *class-const-declaration* must be inside a [*class-definition*](#class-members) or be an +[*interface constant*](15-interfaces.md#interface-members). -A class constant must not have visibility specifier or `static` specifier. +A class constant must not have a `static` specifier. **Semantics:** A *const-declaration* defines a c-constant. -All class constants have public visibility. +If *visibility-modifier* for a class constant is omitted, `public` is assumed. All constants are implicitly `static`. @@ -421,6 +425,9 @@ const LOWER = MIN_VAL; class Automobile { const DEFAULT_COLOR = "white"; + public DEFAULT_BRAND = 'benz'; + protected WHEEL_NUM = 4; + private PRIVATE_CONST = 'const'; ... } $col = Automobile::DEFAULT_COLOR; diff --git a/spec/15-interfaces.md b/spec/15-interfaces.md index 2bc6566..e11ec34 100644 --- a/spec/15-interfaces.md +++ b/spec/15-interfaces.md @@ -88,7 +88,7 @@ processCollection(new MyQueue(...)); <i>interface-member-declarations interface-member-declaration</i> <i>interface-member-declaration:</i> - <i>const-declaration</i> + <i>class-const-declaration</i> <i>method-declaration</i> </pre> @@ -109,6 +109,10 @@ An interface may contain the following members: ##Constants +**Constraints** + +All constants declared in an interface must be implicitly or explicitly public. + **Semantics** An interface constant is just like a class [constant](14-classes.md#constants), except that diff --git a/spec/19-grammar.md b/spec/19-grammar.md index d484fc7..b4d4d9e 100644 --- a/spec/19-grammar.md +++ b/spec/19-grammar.md @@ -1097,7 +1097,7 @@ The grammar notation is described in [Grammars section](09-lexical-structure.md# <i>class-member-declarations class-member-declaration</i> <i>class-member-declaration:</i> - <i>const-declaration</i> + <i>class-const-declaration</i> <i>property-declaration</i> <i>method-declaration</i> <i>constructor-declaration</i> @@ -1107,6 +1107,9 @@ The grammar notation is described in [Grammars section](09-lexical-structure.md# <i>const-declaration:</i> const <i>name</i> = <i>constant-expression</i> ; + <i>class-const-declaration:</i> + <i>visibility-modifier<sub>opt</sub></i> const <i>name</i> = <i>constant-expression</i> ; + <i>property-declaration:</i> <i>property-modifier variable-name property-initializer<sub>opt</sub></i> ; @@ -1163,7 +1166,7 @@ The grammar notation is described in [Grammars section](09-lexical-structure.md# <i>interface-member-declarations interface-member-declaration</i> <i>interface-member-declaration:</i> - <i>const-declaration</i> + <i>class-const-declaration</i> <i>method-declaration</i> </pre> diff --git a/tests/classes/visibility.phpt b/tests/classes/visibility.phpt index 49f5cae..4b48365 100644 --- a/tests/classes/visibility.phpt +++ b/tests/classes/visibility.phpt @@ -15,10 +15,12 @@ class C { // constants - const CON1 = 123; // implicitly static, and can't say so explicitly -// public const CON2 = 123; // class constants are implicitly public; can't say explicitly -// protected const CON3 = 123; // class constants are implicitly public -// private const CON4 = 123; // class constants are implicitly public + const CON1 = 123; // implicitly static and can't say so explicitly + // implicitly public + + public const CON2 = 123; // explicitly public + protected const CON3 = 123; // protected constant + private const CON4 = 123; // private constant // properties diff --git a/tests/constants/constants.phpt b/tests/constants/constants.phpt index 66e1c07..323a521 100644 --- a/tests/constants/constants.phpt +++ b/tests/constants/constants.phpt @@ -165,14 +165,21 @@ trace("FOR", 100); // succeeded class C3 { - const CON1 = 123; // implicitly static, and can't say so explicitly -// public const CON2 = 123; // all class constants are implicitly public; can't say explicitly -// protected const CON3 = 123; // all class constants are implicitly public -// private const CON4 = 123; // all class constants are implicitly public + + const CON1 = 123; // implicitly static and can't say so explicitly + // implicitly public + + public const CON2 = 123; // explicitly public + protected const CON3 = 123; // protected constant + private const CON4 = 123; // private constant } echo "CON1: " . C3::CON1 . "\n"; // use :: notation, as a const is implicitly static +// public const CON80 = 80; // top level const can not have visibility modifier +// protected const CON81 = 81; // top level const can not have visibility modifier +// private const CON82 = 82; // top level const can not have visibility modifier + //print_r(get_defined_constants()); --EXPECTF-- define STATUS1 succeeded; value is >1< diff --git a/tests/interfaces/interfaces.phpt b/tests/interfaces/interfaces.phpt index a7470c7..99f5b6c 100644 --- a/tests/interfaces/interfaces.phpt +++ b/tests/interfaces/interfaces.phpt @@ -13,8 +13,11 @@ error_reporting(-1); interface iX { - const C1 = 123; -// const C2 = "green"; + const C1 = 123; // implicitly public +// const C2 = "green"; + public const C3 = 234; // explicitly public +// protected const C4 = 'C4'; // protected not permitted +// private const C5 = 'C5'; // private not permitted function f0 (); // implicitly public public function f1 ($p1); // explicitly public @@ -56,6 +59,7 @@ class D implements iZ var_dump(D::C1); var_dump(D::C2); +var_dump(D::C3); echo "------------------------------------\n"; @@ -96,6 +100,7 @@ var_dump(MyQueue::MAX_NUMBER_ITEMS); --EXPECT-- int(123) string(5) "green" +int(234) ------------------------------------ object(MyList)#1 (0) { }