Fix static method arg binding in traits

This commit is contained in:
Nikita Popov 2016-04-08 01:48:21 +02:00
parent 75af8150f5
commit 3ad0e1d6ca
2 changed files with 29 additions and 0 deletions

View File

@ -0,0 +1,28 @@
--TEST--
Don't statically bind arguments for self:: calls in traits
--FILE--
<?php
trait T {
public static function method($arg) {
}
public static function call() {
$i = 0;
self::method($i);
var_dump($i);
}
}
class C {
use T;
public static function method(&$arg) {
$arg++;
}
}
C::call();
?>
--EXPECT--
int(1)

View File

@ -77,6 +77,7 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
zend_string *class_name = Z_STR_P(&ZEND_OP1_LITERAL(opline) + 1);
ce = zend_hash_find_ptr(&ctx->script->class_table, class_name);
} else if (opline->op1_type == IS_UNUSED && op_array->scope
&& !(op_array->scope->ce_flags & ZEND_ACC_TRAIT)
&& (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
ce = op_array->scope;
}