diff options
| author | Julien Pauli <jpauli@php.net> | 2014-11-28 13:31:53 +0100 |
|---|---|---|
| committer | Julien Pauli <jpauli@php.net> | 2014-11-28 13:31:53 +0100 |
| commit | 96f2265d583310bcd9782d97460ba73cd64367f6 (patch) | |
| tree | 74f368547a0a9d432e22595fe4a5873a879f2305 | |
| parent | 5f65c77e98fe2b49ad8b8fcd842ad6b20c999ea4 (diff) | |
| parent | a76f8e297d60201631021cc20526968fd0de4ef0 (diff) | |
| download | php-git-96f2265d583310bcd9782d97460ba73cd64367f6.tar.gz | |
Merge branch 'PHP-5.6'
* PHP-5.6:
updated NEWS
updated NEWS
Fix #65419 - Inside trait, self::class != __CLASS__
Conflicts:
Zend/zend_compile.c
| -rw-r--r-- | Zend/tests/bug65419.phpt | 23 | ||||
| -rw-r--r-- | Zend/zend_compile.c | 17 |
2 files changed, 38 insertions, 2 deletions
diff --git a/Zend/tests/bug65419.phpt b/Zend/tests/bug65419.phpt new file mode 100644 index 0000000000..677b2750f2 --- /dev/null +++ b/Zend/tests/bug65419.phpt @@ -0,0 +1,23 @@ +--TEST-- +Bug #65419 (Inside trait, self::class != __CLASS__) +--FILE-- +<?php +trait abc +{ + static function def() + { + echo self::class, "\n"; + echo __CLASS__, "\n"; + } +} + +class ghi +{ + use abc; +} + +ghi::def(); +?> +--EXPECTF-- +ghi +ghi
\ No newline at end of file diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 77f1722117..5dbb41f94d 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5720,8 +5720,21 @@ void zend_compile_resolve_class_name(znode *result, zend_ast *ast TSRMLS_DC) /* zend_error_noreturn(E_COMPILE_ERROR, "Cannot access self::class when no class scope is active"); } - result->op_type = IS_CONST; - ZVAL_STR_COPY(&result->u.constant, CG(active_class_entry)->name); + if (CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) { + zval class_str_zv; + zend_ast *class_str_ast, *class_const_ast; + + ZVAL_STRING(&class_str_zv, "class"); + class_str_ast = zend_ast_create_zval(&class_str_zv); + class_const_ast = zend_ast_create(ZEND_AST_CLASS_CONST, name_ast, class_str_ast); + + zend_compile_expr(result, class_const_ast TSRMLS_CC); + + zval_ptr_dtor(&class_str_zv); + } else { + result->op_type = IS_CONST; + ZVAL_STR_COPY(&result->u.constant, CG(active_class_entry)->name); + } break; case ZEND_FETCH_CLASS_STATIC: case ZEND_FETCH_CLASS_PARENT: |
