Browse Source

Additional fix for bug #76860.

pull/3506/merge
Dmitry Stogov 8 years ago
parent
commit
06f056a760
  1. 34
      Zend/tests/bug76860_2.phpt
  2. 9
      Zend/zend_object_handlers.c

34
Zend/tests/bug76860_2.phpt

@ -0,0 +1,34 @@
--TEST--
Bug #76860 (Missed "Accessing static property as non static" warning)
--FILE--
<?php
class A {
private static $a = "a";
private static $b = "b";
private static $c = "c";
public function __construct() {
var_dump($this->a, $this->b, $this->c);
}
}
class B extends A {
private static $a = "a1";
protected static $b = "b1";
public static $c = "c1";
}
new B;
?>
--EXPECTF--
Notice: Accessing static property B::$a as non static in %sbug76860_2.php on line 7
Notice: Undefined property: B::$a in %sbug76860_2.php on line 7
Notice: Accessing static property B::$b as non static in %sbug76860_2.php on line 7
Notice: Undefined property: B::$b in %sbug76860_2.php on line 7
Notice: Accessing static property B::$c as non static in %sbug76860_2.php on line 7
Notice: Undefined property: B::$c in %sbug76860_2.php on line 7
NULL
NULL
NULL

9
Zend/zend_object_handlers.c

@ -378,7 +378,7 @@ static zend_always_inline uintptr_t zend_get_property_offset(zend_class_entry *c
if (flags & ZEND_ACC_PUBLIC) {
if (!(flags & ZEND_ACC_CHANGED)) {
no_changed:
if (UNEXPECTED((flags & ZEND_ACC_STATIC) != 0)) {
if (UNEXPECTED((property_info->flags & ZEND_ACC_STATIC) != 0)) {
if (!silent) {
zend_error(E_NOTICE, "Accessing static property %s::$%s as non static", ZSTR_VAL(ce->name), ZSTR_VAL(member));
}
@ -431,9 +431,7 @@ check_scope:
&& ((zend_property_info*)Z_PTR_P(zv))->flags & ZEND_ACC_PRIVATE
&& ((zend_property_info*)Z_PTR_P(zv))->ce == scope) {
property_info = (zend_property_info*)Z_PTR_P(zv);
if (UNEXPECTED((property_info->flags & ZEND_ACC_STATIC) != 0)) {
return ZEND_DYNAMIC_PROPERTY_OFFSET;
}
goto no_changed;
} else if (UNEXPECTED(property_info == NULL)) {
exit_dynamic:
if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0' && ZSTR_LEN(member) != 0)) {
@ -481,7 +479,7 @@ ZEND_API zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_s
if (flags & ZEND_ACC_PUBLIC) {
if (!(flags & ZEND_ACC_CHANGED)) {
no_changed:
if (UNEXPECTED((flags & ZEND_ACC_STATIC) != 0)) {
if (UNEXPECTED((property_info->flags & ZEND_ACC_STATIC) != 0)) {
if (!silent) {
zend_error(E_NOTICE, "Accessing static property %s::$%s as non static", ZSTR_VAL(ce->name), ZSTR_VAL(member));
}
@ -533,6 +531,7 @@ check_scope:
&& ((zend_property_info*)Z_PTR_P(zv))->flags & ZEND_ACC_PRIVATE
&& ((zend_property_info*)Z_PTR_P(zv))->ce == scope) {
property_info = (zend_property_info*)Z_PTR_P(zv);
goto no_changed;
} else if (UNEXPECTED(property_info == NULL)) {
exit_dynamic:
if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0' && ZSTR_LEN(member) != 0)) {

Loading…
Cancel
Save