summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/tests/incompat_ctx_user.phpt3
-rw-r--r--Zend/zend_vm_def.h30
-rw-r--r--Zend/zend_vm_execute.h240
3 files changed, 137 insertions, 136 deletions
diff --git a/Zend/tests/incompat_ctx_user.phpt b/Zend/tests/incompat_ctx_user.phpt
index 5923d5a702..2d9b59c1e8 100644
--- a/Zend/tests/incompat_ctx_user.phpt
+++ b/Zend/tests/incompat_ctx_user.phpt
@@ -16,4 +16,5 @@ $b->bar();
?>
--EXPECTF--
-Fatal error: Non-static method A::foo() cannot be called statically, assuming $this from incompatible context in %s on line %d
+Deprecated: Non-static method A::foo() should not be called statically, assuming $this from incompatible context in %s on line %d
+string(1) "B"
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 0958002f43..dc3547a5e2 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2471,24 +2471,24 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE
object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
}
- if (!object) {
+ if (!object ||
+ !instanceof_function(object->ce, ce)) {
+ /* We are calling method of the other (incompatible) class,
+ but passing $this. This is done for compatibility with php-4. */
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* We allow calling userland non-static methods without $this */
- zend_error(E_STRICT,
- "Non-static method %s::%s() should not be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ zend_error(
+ object ? E_DEPRECATED : E_STRICT,
+ "Non-static method %s::%s() should not be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
} else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
+ zend_error_noreturn(
+ E_ERROR,
+ "Non-static method %s::%s() cannot be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
}
- } else if (!instanceof_function(object->ce, ce)) {
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically, "
- "assuming $this from incompatible context",
- fbc->common.scope->name->val, fbc->common.function_name->val);
}
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index da9636eaaa..1d56205e08 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -4257,24 +4257,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(
object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
}
- if (!object) {
+ if (!object ||
+ !instanceof_function(object->ce, ce)) {
+ /* We are calling method of the other (incompatible) class,
+ but passing $this. This is done for compatibility with php-4. */
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* We allow calling userland non-static methods without $this */
- zend_error(E_STRICT,
- "Non-static method %s::%s() should not be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ zend_error(
+ object ? E_DEPRECATED : E_STRICT,
+ "Non-static method %s::%s() should not be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
} else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
+ zend_error_noreturn(
+ E_ERROR,
+ "Non-static method %s::%s() cannot be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
}
- } else if (!instanceof_function(object->ce, ce)) {
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically, "
- "assuming $this from incompatible context",
- fbc->common.scope->name->val, fbc->common.function_name->val);
}
}
@@ -6052,24 +6052,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER
object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
}
- if (!object) {
+ if (!object ||
+ !instanceof_function(object->ce, ce)) {
+ /* We are calling method of the other (incompatible) class,
+ but passing $this. This is done for compatibility with php-4. */
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* We allow calling userland non-static methods without $this */
- zend_error(E_STRICT,
- "Non-static method %s::%s() should not be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ zend_error(
+ object ? E_DEPRECATED : E_STRICT,
+ "Non-static method %s::%s() should not be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
} else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
+ zend_error_noreturn(
+ E_ERROR,
+ "Non-static method %s::%s() cannot be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
}
- } else if (!instanceof_function(object->ce, ce)) {
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically, "
- "assuming $this from incompatible context",
- fbc->common.scope->name->val, fbc->common.function_name->val);
}
}
@@ -7127,24 +7127,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEN
object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
}
- if (!object) {
+ if (!object ||
+ !instanceof_function(object->ce, ce)) {
+ /* We are calling method of the other (incompatible) class,
+ but passing $this. This is done for compatibility with php-4. */
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* We allow calling userland non-static methods without $this */
- zend_error(E_STRICT,
- "Non-static method %s::%s() should not be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ zend_error(
+ object ? E_DEPRECATED : E_STRICT,
+ "Non-static method %s::%s() should not be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
} else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
+ zend_error_noreturn(
+ E_ERROR,
+ "Non-static method %s::%s() cannot be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
}
- } else if (!instanceof_function(object->ce, ce)) {
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically, "
- "assuming $this from incompatible context",
- fbc->common.scope->name->val, fbc->common.function_name->val);
}
}
@@ -8265,24 +8265,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER
object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
}
- if (!object) {
+ if (!object ||
+ !instanceof_function(object->ce, ce)) {
+ /* We are calling method of the other (incompatible) class,
+ but passing $this. This is done for compatibility with php-4. */
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* We allow calling userland non-static methods without $this */
- zend_error(E_STRICT,
- "Non-static method %s::%s() should not be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ zend_error(
+ object ? E_DEPRECATED : E_STRICT,
+ "Non-static method %s::%s() should not be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
} else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
+ zend_error_noreturn(
+ E_ERROR,
+ "Non-static method %s::%s() cannot be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
}
- } else if (!instanceof_function(object->ce, ce)) {
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically, "
- "assuming $this from incompatible context",
- fbc->common.scope->name->val, fbc->common.function_name->val);
}
}
@@ -13393,24 +13393,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZE
object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
}
- if (!object) {
+ if (!object ||
+ !instanceof_function(object->ce, ce)) {
+ /* We are calling method of the other (incompatible) class,
+ but passing $this. This is done for compatibility with php-4. */
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* We allow calling userland non-static methods without $this */
- zend_error(E_STRICT,
- "Non-static method %s::%s() should not be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ zend_error(
+ object ? E_DEPRECATED : E_STRICT,
+ "Non-static method %s::%s() should not be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
} else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
+ zend_error_noreturn(
+ E_ERROR,
+ "Non-static method %s::%s() cannot be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
}
- } else if (!instanceof_function(object->ce, ce)) {
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically, "
- "assuming $this from incompatible context",
- fbc->common.scope->name->val, fbc->common.function_name->val);
}
}
@@ -14882,24 +14882,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(Z
object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
}
- if (!object) {
+ if (!object ||
+ !instanceof_function(object->ce, ce)) {
+ /* We are calling method of the other (incompatible) class,
+ but passing $this. This is done for compatibility with php-4. */
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* We allow calling userland non-static methods without $this */
- zend_error(E_STRICT,
- "Non-static method %s::%s() should not be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ zend_error(
+ object ? E_DEPRECATED : E_STRICT,
+ "Non-static method %s::%s() should not be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
} else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
+ zend_error_noreturn(
+ E_ERROR,
+ "Non-static method %s::%s() cannot be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
}
- } else if (!instanceof_function(object->ce, ce)) {
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically, "
- "assuming $this from incompatible context",
- fbc->common.scope->name->val, fbc->common.function_name->val);
}
}
@@ -16329,24 +16329,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_
object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
}
- if (!object) {
+ if (!object ||
+ !instanceof_function(object->ce, ce)) {
+ /* We are calling method of the other (incompatible) class,
+ but passing $this. This is done for compatibility with php-4. */
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* We allow calling userland non-static methods without $this */
- zend_error(E_STRICT,
- "Non-static method %s::%s() should not be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ zend_error(
+ object ? E_DEPRECATED : E_STRICT,
+ "Non-static method %s::%s() should not be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
} else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
+ zend_error_noreturn(
+ E_ERROR,
+ "Non-static method %s::%s() cannot be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
}
- } else if (!instanceof_function(object->ce, ce)) {
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically, "
- "assuming $this from incompatible context",
- fbc->common.scope->name->val, fbc->common.function_name->val);
}
}
@@ -17766,24 +17766,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(Z
object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
}
- if (!object) {
+ if (!object ||
+ !instanceof_function(object->ce, ce)) {
+ /* We are calling method of the other (incompatible) class,
+ but passing $this. This is done for compatibility with php-4. */
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* We allow calling userland non-static methods without $this */
- zend_error(E_STRICT,
- "Non-static method %s::%s() should not be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ zend_error(
+ object ? E_DEPRECATED : E_STRICT,
+ "Non-static method %s::%s() should not be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
} else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically",
- fbc->common.scope->name->val, fbc->common.function_name->val);
+ /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
+ zend_error_noreturn(
+ E_ERROR,
+ "Non-static method %s::%s() cannot be called statically%s",
+ fbc->common.scope->name->val, fbc->common.function_name->val,
+ object ? ", assuming $this from incompatible context" : "");
}
- } else if (!instanceof_function(object->ce, ce)) {
- zend_error_noreturn(E_ERROR,
- "Non-static method %s::%s() cannot be called statically, "
- "assuming $this from incompatible context",
- fbc->common.scope->name->val, fbc->common.function_name->val);
}
}