Req->Bug #72903 [Opn->Csd]: Spec does not allow $objInstance->memberObj::$staticVar syntax
| From: | nikic@php.net | Date: | Thu, 28 Sep 2017 16:04:21 +0000 |
| Subject: | Req->Bug #72903 [Opn->Csd]: Spec does not allow $objInstance->memberObj::$staticVar syntax | ||
| References: | 1 | Groups: | php.standards |
| Request: | Send a blank email to standards-+get-1296@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=72903&edit=1
ID: 72903
Updated by: nikic@php.net
Reported by: dliebner at gmail dot com
Summary: Spec does not allow
$objInstance->memberObj::$staticVar syntax
-Status: Open
+Status: Closed
-Type: Feature/Change Request
+Type: Bug
-Package: Scripting Engine problem
+Package: PHP Language Specification
PHP Version: 7.0
-Assigned To:
+Assigned To: nikic
Block user comment: N
Private report: N
New Comment:
The spec @ https://github.com/php/php-langspec/blob/master/spec/10-expressions.md#scope-resolution-operator
now specifies the syntax correctly.
Previous Comments:
------------------------------------------------------------------------
[2016-08-20 02:58:29] requinix@php.net
PHP 5.6 does not support that syntax, and I don't think {}s can help with it. PHP 7 does. https://3v4l.org/ad03D
Looking at the spec [1], I see two problems with "$obj->childClass::$var":
1. $obj->childClass would be classified as a scope-resolution-qualifer > expression, which
"must be a value of type string [...] that contains the name of a class or interface
type". This is not true: objects are supported, as seen in
class Example { static $foo = "bar"; }
$e = new Example();
echo $e::$foo; // bar
2. $var must be a member-selection-designator, however that is defined [2] as either a name (without
a '$') or "a value of type string [...] that contains the name of an instance
property (without the leading $) [or a method]". Neither of those cover the static property
usage (which the prose for the scope-resolution operator calls "otherwise"), thus
referencing member-selection-designator is insufficient; I think adding a ":: $ name"
covers this case.
So I'm repurposing this bug to deal with the spec.
[1] https://github.com/php/php-langspec/blob/master/spec/10-expressions.md#scope-resolution-operator
[2] https://github.com/php/php-langspec/blob/master/spec/10-expressions.md#member-selection-operator
------------------------------------------------------------------------
[2016-08-19 22:51:29] dliebner at gmail dot com
Description:
------------
---
From manual page: http://www.php.net/language.oop5.static
---
Code sample below yields 'unexpected T_PAAMAYIM_NEKUDOTAYIM' syntax error.
Test script:
---------------
<?php
class MyClass {
public static $var = 'yay!';
public $childClass;
public function __construct() {
$this->childClass = new ChildClass();
}
}
class ChildClass {
public static $var = 'yay?';
}
$obj = new MyClass();
echo $obj::$var; // works
echo $obj->childClass::$var; // syntax error
?>
Expected result:
----------------
yay!yay?
Actual result:
--------------
Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM), expecting
',' or ';' in __FILE__ on line 25
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=72903&edit=1