mirror of
https://github.com/php/php-src.git
synced 2024-11-30 21:35:36 +08:00
Fix nullsafe operator on $this
This commit is contained in:
parent
42eda5160d
commit
227f1f1481
25
Zend/tests/nullsafe_operator/032.phpt
Normal file
25
Zend/tests/nullsafe_operator/032.phpt
Normal file
@ -0,0 +1,25 @@
|
||||
--TEST--
|
||||
Nullsafe operator on $this
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class Test {
|
||||
public $foo = 42;
|
||||
|
||||
public function method() {
|
||||
var_dump($this?->foo);
|
||||
var_dump($this?->bar());
|
||||
}
|
||||
|
||||
public function bar() {
|
||||
return 24;
|
||||
}
|
||||
}
|
||||
|
||||
$test = new Test;
|
||||
$test->method();
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
int(42)
|
||||
int(24)
|
@ -2788,14 +2788,16 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t
|
||||
zend_emit_op(&obj_node, ZEND_FETCH_THIS, NULL, NULL);
|
||||
}
|
||||
CG(active_op_array)->fn_flags |= ZEND_ACC_USES_THIS;
|
||||
|
||||
/* We will throw if $this doesn't exist, so there's no need to emit a JMP_NULL
|
||||
* check for a nullsafe access. */
|
||||
} else {
|
||||
zend_short_circuiting_mark_inner(obj_ast);
|
||||
opline = zend_delayed_compile_var(&obj_node, obj_ast, type, 0);
|
||||
zend_separate_if_call_and_write(&obj_node, obj_ast, type);
|
||||
}
|
||||
|
||||
if (nullsafe) {
|
||||
zend_emit_jmp_null(&obj_node);
|
||||
if (nullsafe) {
|
||||
zend_emit_jmp_null(&obj_node);
|
||||
}
|
||||
}
|
||||
|
||||
zend_compile_expr(&prop_node, prop_ast);
|
||||
@ -4347,13 +4349,15 @@ void zend_compile_method_call(znode *result, zend_ast *ast, uint32_t type) /* {{
|
||||
zend_emit_op(&obj_node, ZEND_FETCH_THIS, NULL, NULL);
|
||||
}
|
||||
CG(active_op_array)->fn_flags |= ZEND_ACC_USES_THIS;
|
||||
|
||||
/* We will throw if $this doesn't exist, so there's no need to emit a JMP_NULL
|
||||
* check for a nullsafe access. */
|
||||
} else {
|
||||
zend_short_circuiting_mark_inner(obj_ast);
|
||||
zend_compile_expr(&obj_node, obj_ast);
|
||||
}
|
||||
|
||||
if (nullsafe) {
|
||||
zend_emit_jmp_null(&obj_node);
|
||||
if (nullsafe) {
|
||||
zend_emit_jmp_null(&obj_node);
|
||||
}
|
||||
}
|
||||
|
||||
zend_compile_expr(&method_node, method_ast);
|
||||
|
Loading…
Reference in New Issue
Block a user