forward_static_call_array

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

forward_static_call_arrayCall a callback with an array of parameters, preserving the current called class

Опис

function forward_static_call_array(callable $callback, array $args): mixed

Calls a user defined function or method given by the callback parameter, with arguments passed as an array, similarly to call_user_func_array(). When called from within a method context and calling a method callback, it makes a forwarding call, so static:: inside the method resolves to the same called class as in the caller. This is useful for static method callbacks that should behave like self:: or parent::.

Зауваження:

Unlike forward_static_call(), this function does not require an active class scope: calling forward_static_call() outside a class throws an Error, while this function does not.

Параметри

callback

The function or method to be called. This parameter may be an array, with the name of the class, and the method, or a string, with a function name.

args

The parameters to be passed to the callback, as an array.

Зауваження:

To pass a parameter by reference, the corresponding element in args must be a reference.

Значення, що повертаються

Returns the function result, or false on error.

Приклади

Приклад #1 forward_static_call_array() example

<?php

class A
{
    const NAME = 'A';
    public static function test() {
        $args = func_get_args();
        echo static::NAME, " ".join(',', $args)." \n";
    }
}

class B extends A
{
    const NAME = 'B';

    public static function test() {
        echo self::NAME, "\n";
        forward_static_call_array(array('A', 'test'), array('more', 'args'));
        forward_static_call_array( 'test', array('other', 'args'));
    }
}

B::test('foo');

function test() {
        $args = func_get_args();
        echo "C ".join(',', $args)." \n";
    }

?>

Поданий вище приклад виведе:

B
B more,args 
C other,args

Прогляньте також

add a note

User Contributed Notes 2 notes

up
2
nino dot skopac at gmail dot com
10 years ago
Regarding namespaces:

Be sure to include fully namespaced class path:

<?php
forward_static_call_array(
    array('NAMESPACE\CLASS_NAME', 'STATIC_METHOD'),
    $params
);
up
0
israfilov93 at gmal dot com
8 years ago
one of academic example, when forward_static_call() can be useful

<?php

class A
{
    public static function test()
    {
        var_dump('we were here');
        return static::class;
    }
}

class B extends A
{
    public static function test()
    {
        return self::class;
    }
}

class C extends B
{
    public static function test()
    {
        $grandParent = get_parent_class(parent::class); // $grandParent is A
        return forward_static_call([$grandParent, __FUNCTION__]); // calls A::test()
    }
}

// prints 
// string(12) "we were here"
// string(1) "C"
var_dump(C::test());