diff --git a/Zend/tests/bug79862.phpt b/Zend/tests/bug79862.phpt new file mode 100644 index 00000000000..b923da78b46 --- /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-- +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 ee918f741ca..ebec6921cb9 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;