summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-07-15 15:00:45 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-07-15 15:00:45 +0200
commit5785a15f4e9ef3db4ba6c166a2f2a45900d98a14 (patch)
treee13a8333327d8f7720c64a3125d5c0c31a6e57b3
parent9a1a94e9b9195adf92dbafd681c3b9cf0fc59f07 (diff)
parente8430b592f977a8aaccf13f3213ff0d987388d13 (diff)
downloadphp-git-5785a15f4e9ef3db4ba6c166a2f2a45900d98a14.tar.gz
Merge branch 'PHP-7.4'
* PHP-7.4: Fixed bug #79862
-rw-r--r--Zend/tests/bug79862.phpt60
-rw-r--r--Zend/zend_object_handlers.c6
2 files changed, 65 insertions, 1 deletions
diff --git a/Zend/tests/bug79862.phpt b/Zend/tests/bug79862.phpt
new file mode 100644
index 0000000000..b923da78b4
--- /dev/null
+++ b/Zend/tests/bug79862.phpt
@@ -0,0 +1,60 @@
+--TEST--
+Bug #79862: Public non-static property in child should take priority over private static
+--FILE--
+<?php
+
+class a {
+ private static $prop1;
+ private static $prop2;
+ private $prop3;
+ private $prop4;
+ private static $prop5;
+ private static $prop6;
+ public function __construct() {
+ $this->prop1 = 1;
+ $this->prop2 = 2;
+ $this->prop3 = 3;
+ $this->prop4 = 4;
+ $this->prop5 = 5;
+ $this->prop6 = 6;
+ var_dump(self::$prop1);
+ var_dump(self::$prop2);
+ var_dump(self::$prop5);
+ var_dump(self::$prop6);
+ var_dump($this);
+ }
+}
+class c extends a {
+ public $prop1;
+ protected $prop2;
+ public static $prop3;
+ protected static $prop4;
+ public static $prop5;
+ protected static $prop6;
+}
+
+$c = new c;
+
+?>
+--EXPECTF--
+Notice: Accessing static property c::$prop5 as non static in %s on line %d
+
+Notice: Accessing static property c::$prop6 as non static in %s on line %d
+NULL
+NULL
+NULL
+NULL
+object(c)#1 (6) {
+ ["prop1"]=>
+ int(1)
+ ["prop2":protected]=>
+ int(2)
+ ["prop3":"a":private]=>
+ int(3)
+ ["prop4":"a":private]=>
+ int(4)
+ ["prop5"]=>
+ int(5)
+ ["prop6"]=>
+ int(6)
+}
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index ee918f741c..ebec6921cb 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -310,7 +310,11 @@ dynamic:
if (flags & ZEND_ACC_CHANGED) {
zend_property_info *p = zend_get_parent_private_property(scope, ce, member);
- if (p) {
+ /* If there is a public/protected instance property on ce, don't try to use a
+ * private static property on scope. If both are static, prefer the static
+ * property on scope. This will throw a static property notice, rather than
+ * a visibility error. */
+ if (p && (!(p->flags & ZEND_ACC_STATIC) || (flags & ZEND_ACC_STATIC))) {
property_info = p;
flags = property_info->flags;
goto found;