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) {
 }