mirror of
https://github.com/php/php-src.git
synced 2024-09-30 14:26:12 +00:00
Merge branch 'PHP-7.0'
This commit is contained in:
commit
6d98584d00
43
Zend/tests/ArrayAccess_indirect_append.phpt
Normal file
43
Zend/tests/ArrayAccess_indirect_append.phpt
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
--TEST--
|
||||||
|
Using indirect append on ArrayAccess object
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class AA implements ArrayAccess {
|
||||||
|
private $data = [];
|
||||||
|
public function &offsetGet($name) {
|
||||||
|
if (null === $name) {
|
||||||
|
return $this->data[];
|
||||||
|
} else {
|
||||||
|
return $this->data[$name];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function offsetSet($name, $value) {
|
||||||
|
$this->data[$name] = $value;
|
||||||
|
}
|
||||||
|
public function offsetUnset($name) {}
|
||||||
|
public function offsetExists($name) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
$aa = new AA;
|
||||||
|
$aa[3] = 1;
|
||||||
|
$aa[][][0] = 2;
|
||||||
|
var_dump($aa);
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
object(AA)#1 (1) {
|
||||||
|
["data":"AA":private]=>
|
||||||
|
array(2) {
|
||||||
|
[3]=>
|
||||||
|
int(1)
|
||||||
|
[4]=>
|
||||||
|
array(1) {
|
||||||
|
[0]=>
|
||||||
|
array(1) {
|
||||||
|
[0]=>
|
||||||
|
int(2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -27,8 +27,6 @@ $c10 = new C10;
|
|||||||
var_dump($c10[] += 5);
|
var_dump($c10[] += 5);
|
||||||
--EXPECTF--
|
--EXPECTF--
|
||||||
Inside C10::offsetGet
|
Inside C10::offsetGet
|
||||||
|
|
||||||
Notice: Undefined variable: offset in %sbug69955.php on line 10
|
|
||||||
NULL
|
NULL
|
||||||
|
|
||||||
Inside C10::offsetSet
|
Inside C10::offsetSet
|
||||||
|
64
Zend/tests/bug71731.phpt
Normal file
64
Zend/tests/bug71731.phpt
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
--TEST--
|
||||||
|
Bug #71731: Null coalescing operator and ArrayAccess
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class AA implements ArrayAccess {
|
||||||
|
private $data = [];
|
||||||
|
public function offsetExists($name) {
|
||||||
|
echo "offsetExists($name)\n";
|
||||||
|
return array_key_exists($name, $this->data);
|
||||||
|
}
|
||||||
|
public function &offsetGet($name) {
|
||||||
|
echo "offsetGet($name)\n";
|
||||||
|
if (!array_key_exists($name, $this->data)) {
|
||||||
|
throw new Exception('Unknown offset');
|
||||||
|
}
|
||||||
|
return $this->data[$name];
|
||||||
|
}
|
||||||
|
public function offsetSet($name, $value) {
|
||||||
|
echo "offsetSet($name)\n";
|
||||||
|
$this->data[$name] = $value;
|
||||||
|
}
|
||||||
|
public function offsetUnset($name) {
|
||||||
|
echo "offsetUnset($name)\n";
|
||||||
|
unset($this->data[$name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$aa = new AA;
|
||||||
|
var_dump(isset($aa[0][1][2]));
|
||||||
|
var_dump(isset($aa[0]->foo));
|
||||||
|
var_dump($aa[0] ?? 42);
|
||||||
|
var_dump($aa[0][1][2] ?? 42);
|
||||||
|
|
||||||
|
$aa[0] = new AA;
|
||||||
|
$aa[0][1] = new AA;
|
||||||
|
var_dump(isset($aa[0][1][2]));
|
||||||
|
var_dump($aa[0][1][2] ?? 42);
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
offsetExists(0)
|
||||||
|
bool(false)
|
||||||
|
offsetExists(0)
|
||||||
|
bool(false)
|
||||||
|
offsetExists(0)
|
||||||
|
int(42)
|
||||||
|
offsetExists(0)
|
||||||
|
int(42)
|
||||||
|
offsetSet(0)
|
||||||
|
offsetGet(0)
|
||||||
|
offsetSet(1)
|
||||||
|
offsetExists(0)
|
||||||
|
offsetGet(0)
|
||||||
|
offsetExists(1)
|
||||||
|
offsetGet(1)
|
||||||
|
offsetExists(2)
|
||||||
|
bool(false)
|
||||||
|
offsetExists(0)
|
||||||
|
offsetGet(0)
|
||||||
|
offsetExists(1)
|
||||||
|
offsetGet(1)
|
||||||
|
offsetExists(2)
|
||||||
|
int(42)
|
@ -710,13 +710,26 @@ zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv) /*
|
|||||||
zval tmp;
|
zval tmp;
|
||||||
|
|
||||||
if (EXPECTED(instanceof_function_ex(ce, zend_ce_arrayaccess, 1) != 0)) {
|
if (EXPECTED(instanceof_function_ex(ce, zend_ce_arrayaccess, 1) != 0)) {
|
||||||
if(offset == NULL) {
|
if (offset == NULL) {
|
||||||
/* [] construct */
|
/* [] construct */
|
||||||
ZVAL_UNDEF(&tmp);
|
ZVAL_NULL(&tmp);
|
||||||
offset = &tmp;
|
offset = &tmp;
|
||||||
} else {
|
} else {
|
||||||
SEPARATE_ARG_IF_REF(offset);
|
SEPARATE_ARG_IF_REF(offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (type == BP_VAR_IS) {
|
||||||
|
zend_call_method_with_1_params(object, ce, NULL, "offsetexists", rv, offset);
|
||||||
|
if (UNEXPECTED(Z_ISUNDEF_P(rv))) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (!i_zend_is_true(rv)) {
|
||||||
|
zval_ptr_dtor(rv);
|
||||||
|
return &EG(uninitialized_zval);
|
||||||
|
}
|
||||||
|
zval_ptr_dtor(rv);
|
||||||
|
}
|
||||||
|
|
||||||
zend_call_method_with_1_params(object, ce, NULL, "offsetget", rv, offset);
|
zend_call_method_with_1_params(object, ce, NULL, "offsetget", rv, offset);
|
||||||
|
|
||||||
zval_ptr_dtor(offset);
|
zval_ptr_dtor(offset);
|
||||||
|
Loading…
Reference in New Issue
Block a user