forward_static_call

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

forward_static_call调用静态方法

说明

forward_static_call(callable $callback, mixed ...$args): mixed

使用以下参数,调用通过 callback 参数给出的用户定义的函数或者方法。此函数必须在方法上下文中调用,不能在类外调用。它使用后期静态绑定

参数

callback

要调用的函数或者方法。此参数可以是带类名及方法的 array 或者带函数名的 string

args

要传递给函数的零到多个参数。

返回值

返回函数结果,失败时返回 false

示例

示例 #1 forward_static_call() 示例

<?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('A', 'test'), 'more', 'args');
forward_static_call( 'test', 'other', 'args');
}
}

B::test('foo');

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

?>

以上示例会输出:

B
B more,args 
C other,args

参见

添加备注

用户贡献的备注 2 notes

up
5
arthur dot techarts at gmail dot com
14 years ago
Example to understand this function and difference with call_user_func:

<?php
class Beer {
    const NAME = 'Beer!';
    public static function printed(){
        echo 'static Beer:NAME = '. static::NAME . PHP_EOL;
    }
}

class Ale extends Beer {
    const NAME = 'Ale!';
    public static function printed(){
        forward_static_call(array('parent','printed'));
        call_user_func(array('parent','printed'));

        forward_static_call(array('Beer','printed'));
        call_user_func(array('Beer','printed'));
    }
}

Ale::printed();
echo '</pre>';
?>
up
1
jhibbard at gmail dot com
13 years ago
Example usage via calls outside of the class and within an object:<?php/** * @author Jonathon Hibbard */class foo {  # used to verify we're actually setting something..  private static $value = '';  /**   * Simple setter for the static method setValue...   */  public static function set($method_identifier, $value_to_pass = '') {    # make sure we have the right method format...    # another semi-useful example is like this (useful for REST-like requests...): str_replace(" ", "", ucwords(str_replace("_", " ",  $method_identifier)));    $static_method = 'set' . ucfirst(strtolower(trim($method_identifier)));    if(method_exists(__CLASS__, $static_method)) {      //Note:  this will not work and will throw PHP Parse error:  syntax error, unexpected '::'      //__CLASS__::$static_method($value_to_pass);      foo::$static_method($value_to_pass);      echo "\tCalling forward_static_call with pure string and value param:\n";      forward_static_call(__CLASS__ . "::" . $static_method, $value_to_pass);      echo "\tCalling forward_static_call with class, method array and value param:\n";      forward_static_call(array(__CLASS__, $static_method), $value_to_pass);    }  }  /**   * Set self::$value to something?   */  public static function setValue($value_recieved = '') {    echo "\t\tsetValue called with param of " . var_export($value_recieved, true) . "!\n";    echo "\t\tSetting Private 'value'...\n";    self::$value = $value_recieved;    echo "\t\tChecking the Private 'value':\n";    if(!empty(self::$value)) {      echo "\t\t\tPrivate 'value' was set to '" . self::$value . "' as expected!\n";    } else {      echo "\t\t\tPrivate 'value' was not set!\n";    }    # Reset...    self::$value = '';  }  /**   * Create an object and test calling the static method from within this realm...   */  public function __construct() {    echo "\tCalling from within constructor..\n";    foo::set('value','Something else from within the instance!');  }}echo "\n============ Calling by static method first ============\n";foo::set('value','Something from outside of the foo class!');echo "\n============ Calling by static method without a value next ============\n";foo::set('value');echo "\n============ Calling by createing an instance next ============\n";new foo();?>
To Top