PHP Conference Japan 2024

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

要调用的函数或方法。此参数可以是一个数组,包含类名和方法名,也可以是一个字符串,包含函数名。

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 条笔记

arthur dot techarts at gmail dot com
13 年前
理解此函数及其与 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>';
?>
jhibbard at gmail dot com
12 年前
通过在类外部和对象内部的调用进行示例用法

<?php
/**
* @author Jonathon Hibbard
*/
class foo {
# 用于验证我们实际上是否设置了某些内容…
private static $value = '';

/**
* 静态方法 setValue 的简单 setter…
*/
public static function set($method_identifier, $value_to_pass = '') {
# 确保我们具有正确的 method 格式…
# 另一个半有用的例子是这样的(对于类似 REST 的请求很有用):str_replace(" ", "", ucwords(str_replace("_", " ", $method_identifier)));
$static_method = 'set' . ucfirst(strtolower(trim($method_identifier)));

if(
method_exists(__CLASS__, $static_method)) {
//注意:这将不起作用,并将抛出 PHP 解析错误:语法错误,意外的 '::'
//__CLASS__::$static_method($value_to_pass);

foo::$static_method($value_to_pass);

echo
"\t使用纯字符串和值参数调用 forward_static_call:\n";
forward_static_call(__CLASS__ . "::" . $static_method, $value_to_pass);

echo
"\t使用类、方法数组和值参数调用 forward_static_call:\n";
forward_static_call(array(__CLASS__, $static_method), $value_to_pass);
}
}

/**
* 将 self::$value 设置为某些内容?
*/
public static function setValue($value_recieved = '') {
echo
"\t\tsetValue 使用参数 " . var_export($value_recieved, true) . " 调用!\n";

echo
"\t\t正在设置私有变量 'value'...\n";

self::$value = $value_recieved;

echo
"\t\t正在检查私有变量 'value':\n";
if(!empty(
self::$value)) {
echo
"\t\t\t私有变量 'value' 已按预期设置为 '" . self::$value . "'!\n";
} else {
echo
"\t\t\t私有变量 'value' 未设置!\n";
}

# 重置…
self::$value = '';
}

/**
* 创建一个对象并测试从这个范围内调用静态方法…
*/
public function __construct() {
echo
"\t从构造函数内部调用..\n";
foo::set('value','Something else from within the instance!');
}
}

echo
"\n============ 首先通过静态方法调用 ============\n";
foo::set('value','Something from outside of the foo class!');

echo
"\n============ 接下来通过静态方法调用(无值)============\n";
foo::set('value');

echo
"\n============ 接下来通过创建实例调用 ============\n";
new
foo();
?>
To Top