com php-src: Fixed bug #64417 (ArrayAccess::&offsetGet() in a trait causes fatal error): NEWS Zend/tests/bug64417.phpt Zend/zend_compile .c
| From: | Dmitry Stogov | Date: | Tue, 19 Mar 2013 08:48:23 +0000 |
| Subject: | com php-src: Fixed bug #64417 (ArrayAccess::&offsetGet() in a trait causes fatal error): NEWS Zend/tests/bug64417.phpt Zend/zend_compile .c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-71610@lists.php.net to get a copy of this message | ||
Commit: e62bb0325763d9847847dd198e05c9b3147caf05
Author: Dmitry Stogov <dmitry@zend.com> Tue, 19 Mar 2013 12:48:23 +0400
Parents: e25b2d7ea5a2699fb32b467aae9e3a0fda2ba0db
Branches: PHP-5.4 PHP-5.5 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=e62bb0325763d9847847dd198e05c9b3147caf05
Log:
Fixed bug #64417 (ArrayAccess::&offsetGet() in a trait causes fatal error)
Bugs:
https://bugs.php.net/64417
Changed paths:
M NEWS
A Zend/tests/bug64417..phpt
M Zend/zend_compile.c
Diff:
diff --git a/NEWS b/NEWS
index fd05e22..75b588b 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,8 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 2013, PHP 5.4.14
- Core
+ . Fixed bug #64417 (ArrayAccess::&offsetGet() in a trait causes fatal error).
+ (Dmitry)
. Fixed bug #64370 (microtime(true) less than $_SERVER['REQUEST_TIME_FLOAT']).
(Anatol)
diff --git a/Zend/tests/bug64417.phpt b/Zend/tests/bug64417.phpt
new file mode 100644
index 0000000..f3ef740
--- /dev/null
+++ b/Zend/tests/bug64417.phpt
@@ -0,0 +1,39 @@
+--TEST--
+Bug #64417 (BC break: ArrayAccess::&offsetGet() in a trait causes fatal error)
+--FILE--
+<?php
+trait aa {
+ private $container = array();
+ public function offsetSet($offset, $value) {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+ public function offsetExists($offset) {
+ return isset($this->container[$offset]);
+ }
+ public function offsetUnset($offset) {
+ unset($this->container[$offset]);
+ }
+ public function &offsetGet($offset) {
+ $result = null;
+ if (isset($this->container[$offset])) {
+ $result = &$this->container[$offset];
+ }
+ return $result;
+ }
+}
+
+class obj implements ArrayAccess {
+ use aa;
+}
+
+$o = new obj;
+$o['x'] = 1;
+++$o['x'];
+echo $o['x'], "\n";
+--EXPECT--
+2
+
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 0a1749d..766a2de 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -3634,7 +3634,7 @@ static zend_bool zend_traits_method_compatibility_check(zend_function *fn,
zend_
zend_uint other_flags = other_fn->common.scope->ce_flags;
return zend_do_perform_implementation_check(fn, other_fn TSRMLS_CC)
- && zend_do_perform_implementation_check(other_fn, fn TSRMLS_CC)
+ && ((other_fn->common.scope->ce_flags & ZEND_ACC_INTERFACE) ||
zend_do_perform_implementation_check(other_fn, fn TSRMLS_CC))
&& ((fn_flags & (ZEND_ACC_FINAL|ZEND_ACC_STATIC)) ==
(other_flags & (ZEND_ACC_FINAL|ZEND_ACC_STATIC))); /* equal final and static qualifier */
}