Remove static calls to non-static methods

This commit is contained in:
Nikita Popov 2019-01-29 16:03:24 +01:00
parent 4eb5db2c68
commit 6c73b50cf6
48 changed files with 277 additions and 623 deletions

View File

@ -23,6 +23,7 @@ PHP 8.0 UPGRADE NOTES
- Core:
. Methods with the same name as the class are no longer interpreted as
constructors. The __construct() method should be used instead.
. Removed ability to call non-static methods statically.
. Removed (unset) cast.
. Removed track_errors ini directive. This means that $php_errormsg is no
longer available. The error_get_last() function may be used instead.

View File

@ -16,9 +16,6 @@ class foo {
class foo2 extends foo {
}
foo::bar();
foo2::bar();
$f1 = new foo;
$f2 = new foo2;
@ -36,11 +33,6 @@ $f1->testNull();
echo "Done\n";
?>
--EXPECTF--
Deprecated: Non-static method foo::bar() should not be called statically in %s on line %d
string(3) "foo"
Deprecated: Non-static method foo::bar() should not be called statically in %s on line %d
string(3) "foo"
string(3) "foo"
string(3) "foo"

View File

@ -3,7 +3,7 @@ Bug #27669 (PHP 5 didn't support all possibilities for calling static methods dy
--FILE--
<?php
class A {
function hello() {
static function hello() {
echo "Hello World\n";
}
}
@ -12,6 +12,5 @@ Bug #27669 (PHP 5 didn't support all possibilities for calling static methods dy
?>
===DONE===
--EXPECTF--
Deprecated: Non-static method A::hello() should not be called statically in %s on line %d
Hello World
===DONE===

View File

@ -1,27 +0,0 @@
--TEST--
Bug #35437 (Segfault or Invalid Opcode 137/1/4)
--FILE--
<?php
function err2exception($errno, $errstr)
{
throw new Exception("Error occuried: " . $errstr);
}
set_error_handler('err2exception');
class TestClass
{
function testMethod()
{
$GLOBALS['t'] = new stdClass;
}
}
try {
TestClass::testMethod();
} catch (Exception $e) {
echo "Caught: ".$e->getMessage()."\n";
}
?>
--EXPECT--
Caught: Error occuried: Non-static method TestClass::testMethod() should not be called statically

View File

@ -1,51 +0,0 @@
--TEST--
Bug #38047 ("file" and "line" sometimes not set in backtrace from inside error handler)
--FILE--
<?php
error_reporting(E_ALL);
set_error_handler('kalus_error_handler');
ini_set("display_errors", "on");
class A {
function A_ftk($a) {
}
}
function kalus_error_handler($error_code, $error_string, $filename, $line, $symbols) {
echo "$error_string\n";
get_error_context();
}
function get_error_context() {
$backtrace = debug_backtrace();
$n = 1;
foreach ($backtrace as $call) {
echo $n++." ";
if (isset($call["file"])) {
echo $call["file"];
if (isset($call["line"])) {
echo ":".$call["line"];
}
}
if (isset($call["function"])) {
echo " ".$call["function"]."()";
}
echo "\n";
}
echo "\n";
}
//This will not create file and line items for the call into the error handler
$page["name"] = A::A_ftk();
?>
--EXPECTF--
Non-static method A::A_ftk() should not be called statically
1 %sbug38047.php:13 get_error_context()
2 %sbug38047.php:36 kalus_error_handler()
Fatal error: Uncaught ArgumentCountError: Too few arguments to function A::A_ftk(), 0 passed in %sbug38047.php on line 36 and exactly 1 expected in %sbug38047.php:7
Stack trace:
#0 %sbug38047.php(36): A::A_ftk()
#1 {main}
thrown in %sbug38047.php on line 7

View File

@ -15,10 +15,7 @@ Foo::get();
echo "Done\n";
?>
--EXPECTF--
Deprecated: Non-static method Foo::get() should not be called statically in %s on line %d
Fatal error: Uncaught Error: Non-static method Foo::__construct() cannot be called statically in %s:%d
Fatal error: Uncaught Error: Non-static method Foo::get() cannot be called statically in %s:%d
Stack trace:
#0 %s(%d): Foo::get()
#1 {main}
#0 {main}
thrown in %s on line %d

View File

@ -24,8 +24,6 @@ $c->s();
get_called_class();
D::m();
?>
--EXPECTF--
Called class: D
@ -33,11 +31,3 @@ Called class: C
Called class: C
Warning: get_called_class() called from outside a class in %s on line %d
Deprecated: Non-static method D::m() should not be called statically in %s on line %d
Fatal error: Uncaught Error: Using $this when not in object context in %s:%d
Stack trace:
#0 %s(%d): D::m()
#1 {main}
thrown in %s on line %d

View File

@ -26,8 +26,8 @@ $x->a();
$x->b();
$x->c();
$x::a();
$x::b();
$x::c();
$x::b();
?>
--EXPECTF--
@ -35,7 +35,9 @@ string(9) "__call::a"
int(2)
string(9) "__call::c"
string(15) "__callStatic::a"
Deprecated: Non-static method foo::b() should not be called statically in %s on line %d
int(2)
string(15) "__callStatic::c"
Fatal error: Uncaught Error: Non-static method foo::b() cannot be called statically in %s:%d
Stack trace:
#0 {main}
thrown in %s on line %d

View File

@ -1,34 +0,0 @@
--TEST--
Bug #74408 (Endless loop bypassing execution time limit)
--FILE--
<?php
class ErrorHandling {
public function error_handler($errno, $errstr, $errfile, $errline) {
$bla = new NonExistingClass2();
}
public function exception_handler(Error $e) {
echo "Caught, exception: " . $e->getMessage();
}
}
set_error_handler('ErrorHandling::error_handler');
set_exception_handler('ErrorHandling::exception_handler');
$blubb = new NonExistingClass();
?>
--EXPECTF--
Deprecated: Non-static method ErrorHandling::error_handler() should not be called statically in %sbug74408.php on line %d
Deprecated: Non-static method ErrorHandling::error_handler() should not be called statically in %sbug74408.php on line %d
Deprecated: Non-static method ErrorHandling::error_handler() should not be called statically in Unknown on line 0
Fatal error: Uncaught Error: Class 'NonExistingClass2' not found in %sbug74408.php:%d
Stack trace:
#0 [internal function]: ErrorHandling::error_handler(8192, 'Non-static meth...', '%s', %d, Array)
#1 %sbug74408.php(%d): set_exception_handler('ErrorHandling::...')
#2 {main}
thrown in %sbug74408.php on line %d

View File

@ -4,29 +4,15 @@ Testing __callStatic
<?php
class foo {
public function aa() {
print "ok\n";
}
static function __callstatic($a, $b) {
var_dump($a);
}
}
foo::aa();
$b = 'AA';
foo::$b();
foo::__construct();
?>
--EXPECTF--
Deprecated: Non-static method foo::aa() should not be called statically in %s on line %d
ok
Deprecated: Non-static method foo::aa() should not be called statically in %s on line %d
ok
Fatal error: Uncaught Error: Cannot call constructor in %s:%d
Stack trace:
#0 {main}

View File

@ -1,22 +0,0 @@
--TEST--
Calling non-static method with call_user_func()
--FILE--
<?php
class foo {
public function teste() {
$this->a = 1;
}
}
call_user_func(array('foo', 'teste'));
?>
--EXPECTF--
Deprecated: %son-static method foo::teste() should not be called statically in %s on line %d
Fatal error: Uncaught Error: Using $this when not in object context in %s:%d
Stack trace:
#0 %s(%d): foo::teste()
#1 {main}
thrown in %s on line %d

View File

@ -9,7 +9,7 @@ class foo {
return 1;
}
public function teste() {
public static function teste() {
return foo::x(function &($a=1,$b) { });
}
}
@ -18,7 +18,6 @@ var_dump(call_user_func(array('foo', 'teste')));
?>
--EXPECTF--
Deprecated: %son-static method foo::teste() should not be called statically in %s on line %d
string(1) "x"
array(1) {
[0]=>

View File

@ -17,4 +17,4 @@ try {
?>
--EXPECT--
Failed to create closure from callable: non-static method A::method() should not be called statically
Failed to create closure from callable: non-static method A::method() cannot be called statically

View File

@ -12,28 +12,29 @@ function foo(callable $x) {
try {
C::foo();
} catch (Error $e) {
echo "\nException: " . $e->getMessage() . " in " , $e->getFile() . " on line " . $e->getLine() . "\n";
echo $e, "\n\n";
}
try {
foo("C::foo");
} catch (Error $e) {
echo "\n";
do {
echo "Exception: " . $e->getMessage() . "\n";
$e = $e->getPrevious();
} while ($e instanceof Error);
echo $e, "\n\n";
}
C::foo();
?>
--EXPECTF--
Exception: Cannot call abstract method C::foo() in %sexception_017.php on line %d
Exception: Argument 1 passed to foo() must be callable, string given, called in %sexception_017.php on line %d
Exception: Cannot call abstract method C::foo()
Fatal error: Uncaught Error: Cannot call abstract method C::foo() in %sexception_017.php:%d
Error: Cannot call abstract method C::foo() in %s:%d
Stack trace:
#0 {main}
thrown in %sexception_017.php on line %d
TypeError: Argument 1 passed to foo() must be callable, string given, called in %s on line %d and defined in %s:%d
Stack trace:
#0 %s(%d): foo('C::foo')
#1 {main}
Fatal error: Uncaught Error: Cannot call abstract method C::foo() in %s:%d
Stack trace:
#0 {main}
thrown in %s on line %d

View File

@ -36,20 +36,6 @@ class Magic3 {
}
}
$f = array('Hello','world');
try {
var_dump($f('you'));
} catch (Throwable $e) {
echo "Exception: " . $e->getMessage() . "\n";
}
try {
var_dump(call_user_func($f, 'you'));
} catch (Throwable $e) {
echo "Exception: " . $e->getMessage() . "\n";
}
printf("-----\n");
$h= new Hello;
$f = array($h,'world');
var_dump($f('again'));
@ -107,14 +93,6 @@ var_dump(call_user_func($f, 'you'));
?>
--EXPECTF--
Deprecated: Non-static method Hello::world() should not be called statically in %s on line %d
Hello, you
Exception: Using $this when not in object context
Deprecated: %son-static method Hello::world() should not be called statically in %s on line %d
Hello, you
Exception: Using $this when not in object context
-----
Hello, again
object(Hello)#%d (0) {
}

View File

@ -4,18 +4,17 @@ Incompatible context call (non-internal function)
<?php
class A {
function foo() { var_dump(get_class($this)); }
function foo() { var_dump(get_class($this)); }
}
class B {
function bar() { A::foo(); }
function bar() { A::foo(); }
}
$b = new B;
try {
$b->bar();
$b->bar();
} catch (Throwable $e) {
echo "Exception: " . $e->getMessage() . "\n";
echo "Exception: " . $e->getMessage() . "\n";
}
?>
--EXPECTF--
Deprecated: Non-static method A::foo() should not be called statically in %s on line %d
Exception: Using $this when not in object context
Exception: Non-static method A::foo() cannot be called statically

View File

@ -19,10 +19,7 @@ $callback = ['TestClass', 'method'];
echo $callback();
?>
--EXPECTF--
Deprecated: Non-static method TestClass::method() should not be called statically in %s on line %d
Fatal error: Uncaught Error: Using $this when not in object context in %s:%d
Fatal error: Uncaught Error: Non-static method TestClass::method() cannot be called statically in %s:%d
Stack trace:
#0 %s(%d): TestClass::method()
#1 {main}
#0 {main}
thrown in %s on line %d

View File

@ -19,10 +19,7 @@ $callback = 'TestClass::method';
echo $callback();
?>
--EXPECTF--
Deprecated: Non-static method TestClass::method() should not be called statically in %s on line %d
Fatal error: Uncaught Error: Using $this when not in object context in %s:%d
Fatal error: Uncaught Error: Non-static method TestClass::method() cannot be called statically in %s:%d
Stack trace:
#0 %s(%d): TestClass::method()
#1 {main}
#0 {main}
thrown in %s on line %d

View File

@ -17,26 +17,12 @@ class foo extends bar {
$foo = new foo;
$foo->test();
$foo::test();
call_user_func(array($foo, 'test'));
call_user_func(array('foo', 'test'));
?>
--EXPECTF--
object(foo)#%d (0) {
}
Deprecated: Non-static method foo::test() should not be called statically in %s on line %d
Deprecated: Non-static method bar::show() should not be called statically in %s on line %d
object(foo)#%d (0) {
}
object(foo)#%d (0) {
}
Deprecated: %son-static method foo::test() should not be called statically in %s on line %d
Deprecated: Non-static method bar::show() should not be called statically in %s on line %d
object(foo)#%d (0) {
}

View File

@ -14,19 +14,13 @@ $closure = function () {};
foo("strpos");
foo("foo");
foo(array("bar", "baz"));
foo(array("bar", "foo"));
foo($closure);
foo(array("bar", "foo"));
foo(array("bar", "baz"));
--EXPECTF--
string(6) "strpos"
string(3) "foo"
Deprecated: Non-static method bar::baz() should not be called statically in %s on line %d
array(2) {
[0]=>
string(3) "bar"
[1]=>
string(3) "baz"
object(Closure)#1 (0) {
}
array(2) {
[0]=>
@ -34,5 +28,9 @@ array(2) {
[1]=>
string(3) "foo"
}
object(Closure)#%d (0) {
}
Fatal error: Uncaught TypeError: Argument 1 passed to foo() must be callable, array given, called in %s on line %d and defined in %s:%d
Stack trace:
#0 %s(%d): foo(Array)
#1 {main}
thrown in %s on line %d

View File

@ -768,23 +768,17 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
}
if (zend_fcall_info_init(arg, 0, fci, fcc, NULL, &is_callable_error) == SUCCESS) {
if (is_callable_error) {
*severity = E_DEPRECATED;
zend_spprintf(error, 0, "to be a valid callback, %s", is_callable_error);
efree(is_callable_error);
*spec = spec_walk;
return "";
}
ZEND_ASSERT(!is_callable_error);
break;
}
if (is_callable_error) {
*severity = E_ERROR;
zend_spprintf(error, 0, "to be a valid callback, %s", is_callable_error);
efree(is_callable_error);
return "";
} else {
if (is_callable_error) {
*severity = E_ERROR;
zend_spprintf(error, 0, "to be a valid callback, %s", is_callable_error);
efree(is_callable_error);
return "";
} else {
return "valid callback";
}
return "valid callback";
}
}
@ -2338,25 +2332,21 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
if (ctor->common.fn_flags & ZEND_ACC_STATIC) {
zend_error(error_type, "Constructor %s::%s() cannot be static", ZSTR_VAL(scope->name), ZSTR_VAL(ctor->common.function_name));
}
ctor->common.fn_flags &= ~ZEND_ACC_ALLOW_STATIC;
}
if (dtor) {
if (dtor->common.fn_flags & ZEND_ACC_STATIC) {
zend_error(error_type, "Destructor %s::%s() cannot be static", ZSTR_VAL(scope->name), ZSTR_VAL(dtor->common.function_name));
}
dtor->common.fn_flags &= ~ZEND_ACC_ALLOW_STATIC;
}
if (clone) {
if (clone->common.fn_flags & ZEND_ACC_STATIC) {
zend_error(error_type, "%s::%s() cannot be static", ZSTR_VAL(scope->name), ZSTR_VAL(clone->common.function_name));
}
clone->common.fn_flags &= ~ZEND_ACC_ALLOW_STATIC;
}
if (__call) {
if (__call->common.fn_flags & ZEND_ACC_STATIC) {
zend_error(error_type, "Method %s::%s() cannot be static", ZSTR_VAL(scope->name), ZSTR_VAL(__call->common.function_name));
}
__call->common.fn_flags &= ~ZEND_ACC_ALLOW_STATIC;
}
if (__callstatic) {
if (!(__callstatic->common.fn_flags & ZEND_ACC_STATIC)) {
@ -2368,31 +2358,26 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
if (__tostring->common.fn_flags & ZEND_ACC_STATIC) {
zend_error(error_type, "Method %s::%s() cannot be static", ZSTR_VAL(scope->name), ZSTR_VAL(__tostring->common.function_name));
}
__tostring->common.fn_flags &= ~ZEND_ACC_ALLOW_STATIC;
}
if (__get) {
if (__get->common.fn_flags & ZEND_ACC_STATIC) {
zend_error(error_type, "Method %s::%s() cannot be static", ZSTR_VAL(scope->name), ZSTR_VAL(__get->common.function_name));
}
__get->common.fn_flags &= ~ZEND_ACC_ALLOW_STATIC;
}
if (__set) {
if (__set->common.fn_flags & ZEND_ACC_STATIC) {
zend_error(error_type, "Method %s::%s() cannot be static", ZSTR_VAL(scope->name), ZSTR_VAL(__set->common.function_name));
}
__set->common.fn_flags &= ~ZEND_ACC_ALLOW_STATIC;
}
if (__unset) {
if (__unset->common.fn_flags & ZEND_ACC_STATIC) {
zend_error(error_type, "Method %s::%s() cannot be static", ZSTR_VAL(scope->name), ZSTR_VAL(__unset->common.function_name));
}
__unset->common.fn_flags &= ~ZEND_ACC_ALLOW_STATIC;
}
if (__isset) {
if (__isset->common.fn_flags & ZEND_ACC_STATIC) {
zend_error(error_type, "Method %s::%s() cannot be static", ZSTR_VAL(scope->name), ZSTR_VAL(__isset->common.function_name));
}
__isset->common.fn_flags &= ~ZEND_ACC_ALLOW_STATIC;
}
if (__debugInfo) {
if (__debugInfo->common.fn_flags & ZEND_ACC_STATIC) {
@ -3079,38 +3064,14 @@ get_function_via_handler:
if (retval) {
if (fcc->calling_scope && !call_via_handler) {
if (fcc->function_handler->common.fn_flags & ZEND_ACC_ABSTRACT) {
retval = 0;
if (error) {
zend_spprintf(error, 0, "cannot call abstract method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
retval = 0;
} else {
zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
retval = 0;
}
} else if (!fcc->object && !(fcc->function_handler->common.fn_flags & ZEND_ACC_STATIC)) {
int severity;
char *verb;
if (fcc->function_handler->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
severity = E_DEPRECATED;
verb = "should not";
} else {
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
severity = E_ERROR;
verb = "cannot";
}
if ((check_flags & IS_CALLABLE_CHECK_IS_STATIC) != 0) {
retval = 0;
}
retval = 0;
if (error) {
zend_spprintf(error, 0, "non-static method %s::%s() %s be called statically", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name), verb);
if (severity != E_DEPRECATED) {
retval = 0;
}
} else if (retval) {
if (severity == E_ERROR) {
zend_throw_error(NULL, "Non-static method %s::%s() %s be called statically", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name), verb);
} else {
zend_error(severity, "Non-static method %s::%s() %s be called statically", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name), verb);
}
zend_spprintf(error, 0, "non-static method %s::%s() cannot be called statically", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
}
}
if (retval
@ -3366,7 +3327,7 @@ ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_nam
{
zend_fcall_info_cache fcc;
if (zend_is_callable_ex(callable, NULL, IS_CALLABLE_STRICT, callable_name, &fcc, NULL)) {
if (zend_is_callable_ex(callable, NULL, 0, callable_name, &fcc, NULL)) {
if (Z_TYPE_P(callable) == IS_STRING && fcc.calling_scope) {
zval_ptr_dtor_str(callable);
array_init(callable);

View File

@ -297,11 +297,8 @@ ZEND_API ZEND_COLD void zend_wrong_param_count(void);
#define IS_CALLABLE_CHECK_SYNTAX_ONLY (1<<0)
#define IS_CALLABLE_CHECK_NO_ACCESS (1<<1)
#define IS_CALLABLE_CHECK_IS_STATIC (1<<2)
#define IS_CALLABLE_CHECK_SILENT (1<<3)
#define IS_CALLABLE_STRICT (IS_CALLABLE_CHECK_IS_STATIC)
ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, zend_object *object);
ZEND_API zend_string *zend_get_callable_name(zval *callable);
ZEND_API zend_bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error);
@ -471,7 +468,6 @@ ZEND_API extern const zend_fcall_info_cache empty_fcall_info_cache;
* fci->param_count = 0;
* fci->params = NULL;
* The callable_name argument may be NULL.
* Set check_flags to IS_CALLABLE_STRICT for every new usage!
*/
ZEND_API int zend_fcall_info_init(zval *callable, uint32_t check_flags, zend_fcall_info *fci, zend_fcall_info_cache *fcc, zend_string **callable_name, char **error);

View File

@ -319,7 +319,7 @@ ZEND_METHOD(Closure, fromCallable)
success = zend_create_closure_from_callable(return_value, callable, &error);
EG(current_execute_data) = execute_data;
if (success == FAILURE || error) {
if (success == FAILURE) {
if (error) {
zend_type_error("Failed to create closure from callable: %s", error);
efree(error);

View File

@ -5629,12 +5629,8 @@ void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_boo
"public visibility and cannot be static");
}
}
} else {
if (ZSTR_VAL(lcname)[0] != '_' || ZSTR_VAL(lcname)[1] != '_') {
if (!is_static) {
op_array->fn_flags |= ZEND_ACC_ALLOW_STATIC;
}
} else if (zend_string_equals_literal(lcname, ZEND_CONSTRUCTOR_FUNC_NAME)) {
} else if (ZSTR_VAL(lcname)[0] == '_' && ZSTR_VAL(lcname)[1] == '_') {
if (zend_string_equals_literal(lcname, ZEND_CONSTRUCTOR_FUNC_NAME)) {
ce->constructor = (zend_function *) op_array;
} else if (zend_string_equals_literal(lcname, ZEND_DESTRUCTOR_FUNC_NAME)) {
ce->destructor = (zend_function *) op_array;
@ -5697,8 +5693,6 @@ void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_boo
"public visibility and cannot be static");
}
ce->__debugInfo = (zend_function *) op_array;
} else if (!is_static) {
op_array->fn_flags |= ZEND_ACC_ALLOW_STATIC;
}
}

View File

@ -282,10 +282,6 @@ typedef struct _zend_oparray_context {
/* ZEND_DECLARE_INHERITED_CLASS_DELAYED opcodes | | | */
#define ZEND_ACC_EARLY_BINDING (1 << 15) /* | X | | */
/* | | | */
/* method flag (bc only), any method that has this | | | */
/* flag can be used statically and non statically. | | | */
#define ZEND_ACC_ALLOW_STATIC (1 << 16) /* | X | | */
/* | | | */
/* call through user function trampoline. e.g. | | | */
/* __call, __callstatic | | | */
#define ZEND_ACC_CALL_VIA_TRAMPOLINE (1 << 17) /* | X | | */

View File

@ -1969,16 +1969,10 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_method_call(z
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_non_static_method_call(const zend_function *fbc)
{
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
zend_error(E_DEPRECATED,
"Non-static method %s::%s() should not be called statically",
ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
} else {
zend_throw_error(
zend_ce_error,
"Non-static method %s::%s() cannot be called statically",
ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
}
zend_throw_error(
zend_ce_error,
"Non-static method %s::%s() cannot be called statically",
ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
}
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_param_must_be_ref(const zend_function *func, uint32_t arg_num)
@ -3829,9 +3823,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_s
if (UNEXPECTED(!(fbc->common.fn_flags & ZEND_ACC_STATIC))) {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
return NULL;
}
return NULL;
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
@ -3947,9 +3939,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
}
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
return NULL;
}
return NULL;
}
} else {
called_scope = Z_OBJCE_P(obj);

View File

@ -703,20 +703,9 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
}
return FAILURE;
} else if (error) {
/* Capitalize the first latter of the error message */
if (error[0] >= 'a' && error[0] <= 'z') {
error[0] += ('A' - 'a');
}
zend_error(E_DEPRECATED, "%s", error);
efree(error);
if (UNEXPECTED(EG(exception))) {
if (EG(current_execute_data) == &dummy_execute_data) {
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
}
return FAILURE;
}
}
ZEND_ASSERT(!error);
}
func = fci_cache->function_handler;

View File

@ -3529,9 +3529,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -3656,18 +3654,10 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
SAVE_OPLINE();
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
ZEND_ASSERT(!error);
func = fcc.function_handler;
called_scope = fcc.called_scope;
object = fcc.object;
if (error) {
efree(error);
/* This is the only soft error is_callable() can generate */
zend_non_static_method_call(func);
if (UNEXPECTED(EG(exception) != NULL)) {
FREE_OP2();
HANDLE_EXCEPTION();
}
}
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
GC_ADDREF(ZEND_CLOSURE_OBJECT(func));

View File

@ -5514,9 +5514,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -5556,18 +5554,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
SAVE_OPLINE();
function_name = RT_CONSTANT(opline, opline->op2);
if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
ZEND_ASSERT(!error);
func = fcc.function_handler;
called_scope = fcc.called_scope;
object = fcc.object;
if (error) {
efree(error);
/* This is the only soft error is_callable() can generate */
zend_non_static_method_call(func);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
@ -7797,9 +7787,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -7839,18 +7827,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV
SAVE_OPLINE();
function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
ZEND_ASSERT(!error);
func = fcc.function_handler;
called_scope = fcc.called_scope;
object = fcc.object;
if (error) {
efree(error);
/* This is the only soft error is_callable() can generate */
zend_non_static_method_call(func);
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
}
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
@ -9483,9 +9463,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -11270,9 +11248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -11312,18 +11288,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
SAVE_OPLINE();
function_name = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
ZEND_ASSERT(!error);
func = fcc.function_handler;
called_scope = fcc.called_scope;
object = fcc.object;
if (error) {
efree(error);
/* This is the only soft error is_callable() can generate */
zend_non_static_method_call(func);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
@ -25895,9 +25863,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -28646,9 +28612,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -30386,9 +30350,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -33118,9 +33080,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -35413,9 +35373,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -37353,9 +37311,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -37885,9 +37841,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}
@ -39938,9 +39892,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
ce = object->ce;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
HANDLE_EXCEPTION();
}
}

View File

@ -287,7 +287,6 @@ PHP_COM_DOTNET_API IStream *php_com_wrapper_export_stream(php_stream *stream)
}
#define CPH_ME(fname, arginfo) PHP_ME(com_persist, fname, arginfo, ZEND_ACC_PUBLIC)
#define CPH_SME(fname, arginfo) PHP_ME(com_persist, fname, arginfo, ZEND_ACC_ALLOW_STATIC|ZEND_ACC_PUBLIC)
#define CPH_METHOD(fname) static PHP_METHOD(com_persist, fname)
#define CPH_FETCH() php_com_persist_helper *helper = (php_com_persist_helper*)Z_OBJ_P(getThis());

View File

@ -210,16 +210,16 @@ const zend_function_entry php_dom_document_class_functions[] = { /* {{{ */
PHP_FALIAS(adoptNode, dom_document_adopt_node, arginfo_dom_document_adopt_node)
PHP_FALIAS(normalizeDocument, dom_document_normalize_document, arginfo_dom_document_normalize_document)
PHP_FALIAS(renameNode, dom_document_rename_node, arginfo_dom_document_rename_node)
PHP_ME(domdocument, load, arginfo_dom_document_load, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(domdocument, load, arginfo_dom_document_load, ZEND_ACC_PUBLIC)
PHP_FALIAS(save, dom_document_save, arginfo_dom_document_save)
PHP_ME(domdocument, loadXML, arginfo_dom_document_loadxml, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(domdocument, loadXML, arginfo_dom_document_loadxml, ZEND_ACC_PUBLIC)
PHP_FALIAS(saveXML, dom_document_savexml, arginfo_dom_document_savexml)
PHP_ME(domdocument, __construct, arginfo_dom_document_construct, ZEND_ACC_PUBLIC)
PHP_FALIAS(validate, dom_document_validate, arginfo_dom_document_validate)
PHP_FALIAS(xinclude, dom_document_xinclude, arginfo_dom_document_xinclude)
#if defined(LIBXML_HTML_ENABLED)
PHP_ME(domdocument, loadHTML, arginfo_dom_document_loadhtml, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(domdocument, loadHTMLFile, arginfo_dom_document_loadhtmlfile, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(domdocument, loadHTML, arginfo_dom_document_loadhtml, ZEND_ACC_PUBLIC)
PHP_ME(domdocument, loadHTMLFile, arginfo_dom_document_loadhtmlfile, ZEND_ACC_PUBLIC)
PHP_FALIAS(saveHTML, dom_document_save_html, arginfo_dom_document_savehtml)
PHP_FALIAS(saveHTMLFile, dom_document_save_html_file, arginfo_dom_document_savehtmlfile)
#endif /* defined(LIBXML_HTML_ENABLED) */

View File

@ -55,10 +55,10 @@ ZEND_END_ARG_INFO();
*/
const zend_function_entry php_dom_domimplementation_class_functions[] = {
PHP_ME(domimplementation, getFeature, arginfo_dom_implementation_get_feature, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(domimplementation, hasFeature, arginfo_dom_implementation_has_feature, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(domimplementation, createDocumentType, arginfo_dom_implementation_create_documenttype, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(domimplementation, createDocument, arginfo_dom_implementation_create_document, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(domimplementation, getFeature, arginfo_dom_implementation_get_feature, ZEND_ACC_PUBLIC)
PHP_ME(domimplementation, hasFeature, arginfo_dom_implementation_has_feature, ZEND_ACC_PUBLIC)
PHP_ME(domimplementation, createDocumentType, arginfo_dom_implementation_create_documenttype, ZEND_ACC_PUBLIC)
PHP_ME(domimplementation, createDocument, arginfo_dom_implementation_create_document, ZEND_ACC_PUBLIC)
PHP_FE_END
};

View File

@ -20,10 +20,7 @@ class Foo {
Foo::test();
?>
--EXPECTF--
Deprecated: Non-static method Foo::test() should not be called statically in %swrong_inlining_002.php on line 11
Fatal error: Uncaught Error: Using $this when not in object context in %swrong_inlining_002.php:7
Fatal error: Uncaught Error: Non-static method Foo::test() cannot be called statically in %s:%d
Stack trace:
#0 %swrong_inlining_002.php(11): Foo::test()
#1 {main}
thrown in %swrong_inlining_002.php on line 7
#0 {main}
thrown in %s on line %d

View File

@ -117,14 +117,11 @@ array(2) {
string(4) "2---"
}
Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: cannot access private method bar::test2() in %s on line %d
Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: non-static method bar::test2() cannot be called statically in %s on line %d
bool(false)
Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: non-static method bar::test3() cannot be called statically in %s on line %d
bool(false)
array(2) {
[0]=>
string(7) "1===php"
[1]=>
string(4) "2==="
}
Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: class 'bar' does not have a method 'inexistent' in %s on line %d
bool(false)

View File

@ -513,7 +513,7 @@ PHP_FUNCTION(spl_autoload_register)
}
if (ZEND_NUM_ARGS()) {
if (!zend_is_callable_ex(zcallable, NULL, IS_CALLABLE_STRICT, &func_name, &fcc, &error)) {
if (!zend_is_callable_ex(zcallable, NULL, 0, &func_name, &fcc, &error)) {
alfi.ce = fcc.calling_scope;
alfi.func_ptr = fcc.function_handler;
obj_ptr = fcc.object;

View File

@ -48,7 +48,7 @@ catch(Exception $e)
===DONE===
<?php exit(0); ?>
--EXPECT--
Exception: Passed array specifies a non static method but no object (non-static method MyAutoLoader::autoLoad() should not be called statically)
Exception: Passed array specifies a non static method but no object (non-static method MyAutoLoader::autoLoad() cannot be called statically)
MyAutoLoader::autoLoad(TestClass)
MyAutoLoader::autoThrow(TestClass)
Exception: Unavailable

View File

@ -66,7 +66,7 @@ string(22) "MyAutoLoader::autoLoad"
ok
string(22) "MyAutoLoader::dynaLoad"
Function 'MyAutoLoader::dynaLoad' not callable (non-static method MyAutoLoader::dynaLoad() should not be called statically)
Function 'MyAutoLoader::dynaLoad' not callable (non-static method MyAutoLoader::dynaLoad() cannot be called statically)
array(2) {
[0]=>
@ -98,7 +98,7 @@ array(2) {
[1]=>
string(8) "dynaLoad"
}
Passed array specifies a non static method but no object (non-static method MyAutoLoader::dynaLoad() should not be called statically)
Passed array specifies a non static method but no object (non-static method MyAutoLoader::dynaLoad() cannot be called statically)
array(2) {
[0]=>

View File

@ -80,7 +80,7 @@ Exception: Bla
int(0)
====2====
string(22) "MyAutoLoader::dynaLoad"
LogicException: Function 'MyAutoLoader::dynaLoad' not callable (non-static method MyAutoLoader::dynaLoad() should not be called statically)
LogicException: Function 'MyAutoLoader::dynaLoad' not callable (non-static method MyAutoLoader::dynaLoad() cannot be called statically)
int(0)
====3====
array(2) {
@ -100,7 +100,7 @@ array(2) {
[1]=>
string(8) "dynaLoad"
}
LogicException: Passed array specifies a non static method but no object (non-static method MyAutoLoader::dynaLoad() should not be called statically)
LogicException: Passed array specifies a non static method but no object (non-static method MyAutoLoader::dynaLoad() cannot be called statically)
int(0)
====5====
array(2) {

View File

@ -22,7 +22,7 @@ echo "-- simple class with public variable and method --\n";
class SimpleClass
{
public $var1 = 1;
public function square($n) {
public static function square($n) {
return $n * $n;
}
}
@ -36,7 +36,7 @@ echo "\n-- simple class with private variable and method --\n";
class SimpleClassPri
{
private $var1 = 10;
private function add($n) {
private static function add($n) {
return $var + $n;
}
}
@ -46,7 +46,7 @@ echo "\n-- simple class with protected variable and method --\n";
class SimpleClassPro
{
protected $var1 = 5;
protected function mul($n) {
protected static function mul($n) {
return $var1 * $n;
}
}
@ -62,14 +62,14 @@ echo "\n-- abstract class --\n";
abstract class AbstractClass
{
protected $var2 = 5;
abstract function emptyFunction();
abstract static function emptyFunction();
}
// class deriving the above abstract class
class ChildClass extends AbstractClass
{
private $var3;
public function emptyFunction() {
public static function emptyFunction() {
echo "defined in child\n";
}
}
@ -79,7 +79,7 @@ echo "\n-- class with final method --\n";
class FinalClass
{
private $var4;
final function finalMethod() {
final static function finalMethod() {
echo "This function can't be overloaded\n";
}
}
@ -126,8 +126,6 @@ test(array('InterClass', 'square'), array(1, 2));
*** Testing array_map() : object functionality ***
-- simple class with public variable and method --
SimpleClass::square
Deprecated: array_map() expects parameter 1 to be a valid callback, non-static method SimpleClass::square() should not be called statically in %sarray_map_object1.php on line %d
array(2) {
[0]=>
int(1)
@ -155,8 +153,6 @@ NULL
-- abstract class --
ChildClass::emptyFunction
Deprecated: array_map() expects parameter 1 to be a valid callback, non-static method ChildClass::emptyFunction() should not be called statically in %sarray_map_object1.php on line %d
defined in child
defined in child
array(2) {
@ -168,8 +164,6 @@ array(2) {
-- class with final method --
FinalClass::finalMethod
Deprecated: array_map() expects parameter 1 to be a valid callback, non-static method FinalClass::finalMethod() should not be called statically in %sarray_map_object1.php on line %d
This function can't be overloaded
This function can't be overloaded
array(2) {

View File

@ -3,24 +3,19 @@ register_shutdown_function() & __call
--FILE--
<?php
class test {
function _foo() {
throw new Exception('test');
}
function __call($name=null, $args=null) {
return test::_foo();
}
function _foo() {
throw new Exception('test');
}
function __call($name=null, $args=null) {
return test::_foo();
}
}
try {
var_dump(register_shutdown_function(array("test","__call")));
} catch (Error $e) {
echo "\nException: " . $e->getMessage() . "\n";
}
var_dump(register_shutdown_function(array("test","__call")));
echo "Done\n";
?>
--EXPECTF--
Exception: Non-static method test::__call() cannot be called statically
Warning: register_shutdown_function(): Invalid shutdown callback 'test::__call' passed in %s on line %d
bool(false)
Done
Fatal error: Non-static method test::__call() cannot be called statically in %s on line %d

View File

@ -46,13 +46,8 @@ Warning: register_shutdown_function(): Invalid shutdown callback 'Array' passed
Warning: register_shutdown_function(): Invalid shutdown callback 'bar' passed in %s on line %d
Deprecated: Non-static method bar::barfoo() should not be called statically in %sbug32647.php on line %d
Warning: register_shutdown_function(): Invalid shutdown callback 'bar::barfoo' passed in %sbug32647.php on line %d
Warning: register_shutdown_function(): Invalid shutdown callback 'bar::foobar' passed in %sbug32647.php on line %d
foo!
Deprecated: Non-static method bar::barfoo() should not be called statically in Unknown on line 0
Deprecated: Non-static method bar::barfoo() should not be called statically in Unknown on line 0
bar!
bar!

View File

@ -8,18 +8,20 @@ class foo {
}
}
var_dump(is_callable(array('foo','bar')));
foo::bar();
try {
foo::bar();
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
var_dump(is_callable(array('Exception','getMessage')));
Exception::getMessage();
try {
Exception::getMessage();
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
?>
--EXPECTF--
bool(true)
Deprecated: Non-static method foo::bar() should not be called statically in %sbug47857.php on line %d
ok
--EXPECT--
bool(false)
Fatal error: Uncaught Error: Non-static method Exception::getMessage() cannot be called statically in %sbug47857.php:%d
Stack trace:
#0 {main}
thrown in %sbug47857.php on line %d
Non-static method foo::bar() cannot be called statically
bool(false)
Non-static method Exception::getMessage() cannot be called statically

View File

@ -207,12 +207,12 @@ object_class::func
bool(false)
object_class::func
-- Innerloop iteration 10 of Outerloop iteration 1 --
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
object_class::foo1
bool(true)
bool(false)
object_class::foo1
--- Outerloop iteration 2 ---
-- Innerloop iteration 1 of Outerloop iteration 2 --
@ -288,12 +288,12 @@ no_member_class::func
bool(false)
no_member_class::func
-- Innerloop iteration 10 of Outerloop iteration 2 --
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
object_class::foo1
bool(true)
bool(false)
object_class::foo1
--- Outerloop iteration 3 ---
-- Innerloop iteration 1 of Outerloop iteration 3 --
@ -369,12 +369,12 @@ contains_object_class::func
bool(true)
contains_object_class::func
-- Innerloop iteration 10 of Outerloop iteration 3 --
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
object_class::foo1
bool(true)
bool(false)
object_class::foo1
--- Outerloop iteration 4 ---
-- Innerloop iteration 1 of Outerloop iteration 4 --
@ -450,12 +450,12 @@ contains_object_class::func
bool(true)
contains_object_class::func
-- Innerloop iteration 10 of Outerloop iteration 4 --
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
object_class::foo1
bool(true)
bool(false)
object_class::foo1
--- Outerloop iteration 5 ---
-- Innerloop iteration 1 of Outerloop iteration 5 --
@ -531,12 +531,12 @@ object_class::func
bool(false)
object_class::func
-- Innerloop iteration 10 of Outerloop iteration 5 --
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
object_class::foo1
bool(true)
bool(false)
object_class::foo1
--- Outerloop iteration 6 ---
-- Innerloop iteration 1 of Outerloop iteration 6 --
@ -612,12 +612,12 @@ no_member_class::func
bool(false)
no_member_class::func
-- Innerloop iteration 10 of Outerloop iteration 6 --
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
object_class::foo1
bool(true)
bool(false)
object_class::foo1
--- Outerloop iteration 7 ---
-- Innerloop iteration 1 of Outerloop iteration 7 --
@ -693,12 +693,12 @@ object_class::func
bool(false)
object_class::func
-- Innerloop iteration 10 of Outerloop iteration 7 --
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
object_class::foo1
bool(true)
bool(false)
object_class::foo1
--- Outerloop iteration 8 ---
-- Innerloop iteration 1 of Outerloop iteration 8 --
@ -774,11 +774,11 @@ Array
bool(false)
Array
-- Innerloop iteration 10 of Outerloop iteration 8 --
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
object_class::foo1
bool(true)
bool(false)
object_class::foo1
===DONE===

View File

@ -1259,7 +1259,7 @@ static const zend_function_entry xmlreader_functions[] /* {{{ */ = {
PHP_ME(xmlreader, moveToElement, arginfo_xmlreader_moveToElement, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, moveToFirstAttribute, arginfo_xmlreader_moveToFirstAttribute, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, moveToNextAttribute, arginfo_xmlreader_moveToNextAttribute, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, open, arginfo_xmlreader_open, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(xmlreader, open, arginfo_xmlreader_open, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, read, arginfo_xmlreader_read, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, next, arginfo_xmlreader_next, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, readInnerXml, arginfo_xmlreader_readInnerXml, ZEND_ACC_PUBLIC)
@ -1272,7 +1272,7 @@ static const zend_function_entry xmlreader_functions[] /* {{{ */ = {
PHP_ME(xmlreader, setParserProperty, arginfo_xmlreader_setParserProperty, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, setRelaxNGSchema, arginfo_xmlreader_setRelaxNGSchema, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, setRelaxNGSchemaSource, arginfo_xmlreader_setRelaxNGSchemaSource, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, XML, arginfo_xmlreader_XML, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(xmlreader, XML, arginfo_xmlreader_XML, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, expand, arginfo_xmlreader_expand, ZEND_ACC_PUBLIC)
PHP_FE_END
}; /* }}} */

View File

@ -5,7 +5,7 @@ Bug #23384 (use of class constants in statics)
define('TEN', 10);
class Foo {
const HUN = 100;
function test($x = Foo::HUN) {
static function test($x = Foo::HUN) {
static $arr2 = array(TEN => 'ten');
static $arr = array(Foo::HUN => 'ten');
@ -18,8 +18,7 @@ class Foo {
Foo::test();
echo Foo::HUN."\n";
?>
--EXPECTF--
Deprecated: Non-static method Foo::test() should not be called statically in %sbug23384.php on line %d
--EXPECT--
Array
(
[100] => ten

View File

@ -4,70 +4,95 @@ Pass uninitialised variables by reference and by value to test implicit initiali
<?php
function v($val) {
$val = "Val changed";
$val = "Val changed";
}
function r(&$ref) {
$ref = "Ref changed";
$ref = "Ref changed";
}
function vv($val1, $val2) {
$val1 = "Val1 changed";
$val2 = "Val2 changed";
$val1 = "Val1 changed";
$val2 = "Val2 changed";
}
function vr($val, &$ref) {
$val = "Val changed";
$ref = "Ref changed";
$val = "Val changed";
$ref = "Ref changed";
}
function rv(&$ref, $val) {
$val = "Val changed";
$ref = "Ref changed";
$val = "Val changed";
$ref = "Ref changed";
}
function rr(&$ref1, &$ref2) {
$ref1 = "Ref1 changed";
$ref2 = "Ref2 changed";
$ref1 = "Ref1 changed";
$ref2 = "Ref2 changed";
}
class C {
function __construct($val, &$ref) {
$val = "Val changed";
$ref = "Ref changed";
}
function __construct($val, &$ref) {
$val = "Val changed";
$ref = "Ref changed";
}
function v($val) {
$val = "Val changed";
}
function v($val) {
$val = "Val changed";
}
function r(&$ref) {
$ref = "Ref changed";
}
function r(&$ref) {
$ref = "Ref changed";
}
function vv($val1, $val2) {
$val1 = "Val1 changed";
$val2 = "Val2 changed";
}
function vv($val1, $val2) {
$val1 = "Val1 changed";
$val2 = "Val2 changed";
}
function vr($val, &$ref) {
$val = "Val changed";
$ref = "Ref changed";
}
function vr($val, &$ref) {
$val = "Val changed";
$ref = "Ref changed";
}
function rv(&$ref, $val) {
$val = "Val changed";
$ref = "Ref changed";
}
function rv(&$ref, $val) {
$val = "Val changed";
$ref = "Ref changed";
}
function rr(&$ref1, &$ref2) {
$ref1 = "Ref1 changed";
$ref2 = "Ref2 changed";
}
function rr(&$ref1, &$ref2) {
$ref1 = "Ref1 changed";
$ref2 = "Ref2 changed";
}
static function static_v($val) {
$val = "Val changed";
}
static function static_r(&$ref) {
$ref = "Ref changed";
}
static function static_vv($val1, $val2) {
$val1 = "Val1 changed";
$val2 = "Val2 changed";
}
static function static_vr($val, &$ref) {
$val = "Val changed";
$ref = "Ref changed";
}
static function static_rv(&$ref, $val) {
$val = "Val changed";
$ref = "Ref changed";
}
static function static_rr(&$ref1, &$ref2) {
$ref1 = "Ref1 changed";
$ref2 = "Ref2 changed";
}
}
echo "\n ---- Pass by ref / pass by val: functions ----\n";
@ -95,24 +120,24 @@ var_dump($u1, $u2);
echo "\n\n ---- Pass by ref / pass by val: static method calls ----\n";
unset($u1, $u2);
C::v($u1);
C::r($u2);
C::static_v($u1);
C::static_r($u2);
var_dump($u1, $u2);
unset($u1, $u2);
C::vv($u1, $u2);
C::static_vv($u1, $u2);
var_dump($u1, $u2);
unset($u1, $u2);
C::vr($u1, $u2);
C::static_vr($u1, $u2);
var_dump($u1, $u2);
unset($u1, $u2);
C::rv($u1, $u2);
C::static_rv($u1, $u2);
var_dump($u1, $u2);
unset($u1, $u2);
C::rr($u1, $u2);
C::static_rr($u1, $u2);
var_dump($u1, $u2);
echo "\n\n ---- Pass by ref / pass by val: instance method calls ----\n";
@ -145,31 +170,31 @@ var_dump($u1, $u2);
--EXPECTF--
---- Pass by ref / pass by val: functions ----
Notice: Undefined variable: u1 in %s on line 72
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u1 in %s on line 74
Notice: Undefined variable: u1 in %s on line %d
NULL
string(11) "Ref changed"
Notice: Undefined variable: u1 in %s on line 77
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u2 in %s on line 77
Notice: Undefined variable: u2 in %s on line %d
Notice: Undefined variable: u1 in %s on line 78
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u2 in %s on line 78
Notice: Undefined variable: u2 in %s on line %d
NULL
NULL
Notice: Undefined variable: u1 in %s on line 81
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u1 in %s on line 82
Notice: Undefined variable: u1 in %s on line %d
NULL
string(11) "Ref changed"
Notice: Undefined variable: u2 in %s on line 85
Notice: Undefined variable: u2 in %s on line %d
Notice: Undefined variable: u2 in %s on line 86
Notice: Undefined variable: u2 in %s on line %d
string(11) "Ref changed"
NULL
string(12) "Ref1 changed"
@ -178,82 +203,70 @@ string(12) "Ref2 changed"
---- Pass by ref / pass by val: static method calls ----
Deprecated: Non-static method C::v() should not be called statically in %s on line 95
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u1 in %s on line 95
Deprecated: Non-static method C::r() should not be called statically in %s on line 96
Notice: Undefined variable: u1 in %s on line 97
Notice: Undefined variable: u1 in %s on line %d
NULL
string(11) "Ref changed"
Deprecated: Non-static method C::vv() should not be called statically in %s on line 100
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u1 in %s on line 100
Notice: Undefined variable: u2 in %s on line %d
Notice: Undefined variable: u2 in %s on line 100
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u1 in %s on line 101
Notice: Undefined variable: u2 in %s on line 101
Notice: Undefined variable: u2 in %s on line %d
NULL
NULL
Deprecated: Non-static method C::vr() should not be called statically in %s on line 104
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u1 in %s on line 104
Notice: Undefined variable: u1 in %s on line 105
Notice: Undefined variable: u1 in %s on line %d
NULL
string(11) "Ref changed"
Deprecated: Non-static method C::rv() should not be called statically in %s on line 108
Notice: Undefined variable: u2 in %s on line %d
Notice: Undefined variable: u2 in %s on line 108
Notice: Undefined variable: u2 in %s on line 109
Notice: Undefined variable: u2 in %s on line %d
string(11) "Ref changed"
NULL
Deprecated: Non-static method C::rr() should not be called statically in %s on line 112
string(12) "Ref1 changed"
string(12) "Ref2 changed"
---- Pass by ref / pass by val: instance method calls ----
Notice: Undefined variable: u1 in %s on line 117
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u1 in %s on line 118
Notice: Undefined variable: u1 in %s on line %d
NULL
string(11) "Ref changed"
Notice: Undefined variable: u1 in %s on line 121
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u1 in %s on line 123
Notice: Undefined variable: u1 in %s on line %d
NULL
string(11) "Ref changed"
Notice: Undefined variable: u1 in %s on line 126
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u2 in %s on line 126
Notice: Undefined variable: u2 in %s on line %d
Notice: Undefined variable: u1 in %s on line 127
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u2 in %s on line 127
Notice: Undefined variable: u2 in %s on line %d
NULL
NULL
Notice: Undefined variable: u1 in %s on line 130
Notice: Undefined variable: u1 in %s on line %d
Notice: Undefined variable: u1 in %s on line 131
Notice: Undefined variable: u1 in %s on line %d
NULL
string(11) "Ref changed"
Notice: Undefined variable: u2 in %s on line 134
Notice: Undefined variable: u2 in %s on line %d
Notice: Undefined variable: u2 in %s on line 135
Notice: Undefined variable: u2 in %s on line %d
string(11) "Ref changed"
NULL
string(12) "Ref1 changed"

View File

@ -30,6 +30,14 @@ class C {
$ref5 = "Ref5 changed";
}
static function static_refs(&$ref1, &$ref2, &$ref3, &$ref4, &$ref5) {
$ref1 = "Ref1 changed";
$ref2 = "Ref2 changed";
$ref3 = "Ref3 changed";
$ref4 = "Ref4 changed";
$ref5 = "Ref5 changed";
}
}
echo "\n ---- Pass uninitialised array & object by ref: function call ---\n";
@ -39,7 +47,7 @@ var_dump($u1, $u2, $u3, $u4, $u5);
echo "\n ---- Pass uninitialised arrays & objects by ref: static method call ---\n";
unset($u1, $u2, $u3, $u4, $u5);
C::refs($u1[0], $u2[0][1], $u3->a, $u4->a->b, $u5->a->b->c);
C::static_refs($u1[0], $u2[0][1], $u3->a, $u4->a->b, $u5->a->b->c);
var_dump($u1, $u2, $u3, $u4, $u5);
echo "\n\n---- Pass uninitialised arrays & objects by ref: constructor ---\n";
@ -89,8 +97,6 @@ object(stdClass)#%d (1) {
}
---- Pass uninitialised arrays & objects by ref: static method call ---
Deprecated: Non-static method C::refs() should not be called statically in %s on line 39
array(1) {
[0]=>
string(12) "Ref1 changed"

View File

@ -25,9 +25,10 @@ checkAndClean();
?>
--EXPECTF--
Warning: ob_start(): non-static method C::h() should not be called statically in %s on line 20
bool(true)
Warning: ob_start(): non-static method C::h() cannot be called statically in %s on line %d
Notice: ob_start(): failed to create buffer in %s on line %d
bool(false)
Array
(
[0] => C::h
)