diff options
-rw-r--r-- | Zend/tests/incompat_ctx_user.phpt | 3 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 30 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 240 |
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); } } |