summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-05-24 09:49:44 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-05-24 10:58:46 +0200
commitd7f3844c87c11073b717d0e888ab0d5c4074f216 (patch)
treeee4e377e21d54f9c1279fc4d15a7270b5f9f9916
parentd9747c23a2e16825e141c5b2573afb805d42f97f (diff)
downloadphp-git-d7f3844c87c11073b717d0e888ab0d5c4074f216.tar.gz
Deprecate use of parent where no parent exists
This deprecation is part of the covariance RFC.
-rw-r--r--Zend/tests/class_name_as_scalar_error_002.phpt2
-rw-r--r--Zend/tests/type_declarations/variance/parent_in_class.phpt2
-rw-r--r--Zend/zend_compile.c14
3 files changed, 14 insertions, 4 deletions
diff --git a/Zend/tests/class_name_as_scalar_error_002.phpt b/Zend/tests/class_name_as_scalar_error_002.phpt
index 3abba7f7fe..cbea0c2dcc 100644
--- a/Zend/tests/class_name_as_scalar_error_002.phpt
+++ b/Zend/tests/class_name_as_scalar_error_002.phpt
@@ -11,6 +11,8 @@ namespace Foo\Bar {
}
?>
--EXPECTF--
+Deprecated: Cannot use "parent" when current class scope has no parent in %s on line %d
+
Fatal error: Uncaught Error: Cannot use "parent" when current class scope has no parent in %s:%d
Stack trace:
#0 {main}
diff --git a/Zend/tests/type_declarations/variance/parent_in_class.phpt b/Zend/tests/type_declarations/variance/parent_in_class.phpt
index 88b711bddd..c65146676d 100644
--- a/Zend/tests/type_declarations/variance/parent_in_class.phpt
+++ b/Zend/tests/type_declarations/variance/parent_in_class.phpt
@@ -40,6 +40,8 @@ class B4 extends A4 {
?>
--EXPECTF--
+Deprecated: Cannot use "parent" when current class scope has no parent in %s on line %d
+
Warning: Declaration of B4::method(A4 $x) should be compatible with A4::method(P4 $x) in %s on line %d
Warning: Could not check compatibility between B::method(A $x) and A::method(parent $x), because class parent is not available in %s on line %d
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 43301b1147..b66ac4dcba 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -1319,10 +1319,16 @@ static uint32_t zend_get_class_fetch_type_ast(zend_ast *name_ast) /* {{{ */
static void zend_ensure_valid_class_fetch_type(uint32_t fetch_type) /* {{{ */
{
- if (fetch_type != ZEND_FETCH_CLASS_DEFAULT && !CG(active_class_entry) && zend_is_scope_known()) {
- zend_error_noreturn(E_COMPILE_ERROR, "Cannot use \"%s\" when no class scope is active",
- fetch_type == ZEND_FETCH_CLASS_SELF ? "self" :
- fetch_type == ZEND_FETCH_CLASS_PARENT ? "parent" : "static");
+ if (fetch_type != ZEND_FETCH_CLASS_DEFAULT && zend_is_scope_known()) {
+ zend_class_entry *ce = CG(active_class_entry);
+ if (!ce) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot use \"%s\" when no class scope is active",
+ fetch_type == ZEND_FETCH_CLASS_SELF ? "self" :
+ fetch_type == ZEND_FETCH_CLASS_PARENT ? "parent" : "static");
+ } else if (fetch_type == ZEND_FETCH_CLASS_PARENT && !ce->parent_name) {
+ zend_error(E_DEPRECATED,
+ "Cannot use \"parent\" when current class scope has no parent");
+ }
}
}
/* }}} */