diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-07-15 15:00:45 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-07-15 15:00:45 +0200 |
commit | 5785a15f4e9ef3db4ba6c166a2f2a45900d98a14 (patch) | |
tree | e13a8333327d8f7720c64a3125d5c0c31a6e57b3 | |
parent | 9a1a94e9b9195adf92dbafd681c3b9cf0fc59f07 (diff) | |
parent | e8430b592f977a8aaccf13f3213ff0d987388d13 (diff) | |
download | php-git-5785a15f4e9ef3db4ba6c166a2f2a45900d98a14.tar.gz |
Merge branch 'PHP-7.4'
* PHP-7.4:
Fixed bug #79862
-rw-r--r-- | Zend/tests/bug79862.phpt | 60 | ||||
-rw-r--r-- | Zend/zend_object_handlers.c | 6 |
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; |