summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/tests/bug77291.phpt42
-rw-r--r--Zend/zend_inheritance.c22
2 files changed, 53 insertions, 11 deletions
diff --git a/Zend/tests/bug77291.phpt b/Zend/tests/bug77291.phpt
new file mode 100644
index 0000000000..2960648a7c
--- /dev/null
+++ b/Zend/tests/bug77291.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Bug #77291 (magic methods inherited from a trait may be ignored)
+--FILE--
+<?php
+
+trait AccessibleProperties
+{
+ public function __isset($property)
+ {
+ return property_exists($this, $property);
+ }
+
+ public function __get($property)
+ {
+ if (property_exists($this, $property)) {
+ return $this->$property;
+ }
+ }
+}
+
+class Foo4567 {
+ use AccessibleProperties;
+
+ protected $a = 'Some value';
+}
+
+class Foo45 {
+ use AccessibleProperties;
+
+ protected $a = 'Some value';
+}
+
+$foo = new Foo4567;
+var_dump(isset($foo->a));
+$foo = new Foo45;
+var_dump($foo->a);
+?>
+===DONE===
+--EXPECT--
+bool(true)
+string(10) "Some value"
+===DONE===
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index 0ba108d18d..b116a7fbee 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -1178,17 +1178,7 @@ static void zend_do_implement_interfaces(zend_class_entry *ce) /* {{{ */
static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zend_function* fe) /* {{{ */
{
- if (ZSTR_LEN(ce->name) == ZSTR_LEN(mname)) {
- zend_string *lowercase_name = zend_string_tolower(ce->name);
- lowercase_name = zend_new_interned_string(lowercase_name);
- if (!memcmp(ZSTR_VAL(mname), ZSTR_VAL(lowercase_name), ZSTR_LEN(mname))) {
- if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) {
- zend_error_noreturn(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ZSTR_VAL(ce->name));
- }
- ce->constructor = fe;
- }
- zend_string_release_ex(lowercase_name, 0);
- } else if (ZSTR_VAL(mname)[0] != '_' || ZSTR_VAL(mname)[1] != '_') {
+ if (ZSTR_LEN(ce->name) != ZSTR_LEN(mname) && (ZSTR_VAL(mname)[0] != '_' || ZSTR_VAL(mname)[1] != '_')) {
/* pass */
} else if (zend_string_equals_literal(mname, ZEND_CLONE_FUNC_NAME)) {
ce->clone = fe;
@@ -1219,6 +1209,16 @@ static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zen
ce->__tostring = fe;
} else if (zend_string_equals_literal(mname, ZEND_DEBUGINFO_FUNC_NAME)) {
ce->__debugInfo = fe;
+ } else if (ZSTR_LEN(ce->name) == ZSTR_LEN(mname)) {
+ zend_string *lowercase_name = zend_string_tolower(ce->name);
+ lowercase_name = zend_new_interned_string(lowercase_name);
+ if (!memcmp(ZSTR_VAL(mname), ZSTR_VAL(lowercase_name), ZSTR_LEN(mname))) {
+ if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) {
+ zend_error_noreturn(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ZSTR_VAL(ce->name));
+ }
+ ce->constructor = fe;
+ }
+ zend_string_release_ex(lowercase_name, 0);
}
}
/* }}} */