CakeFest 2024: The Official CakePHP Conference

forward_static_call

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

forward_static_callstatic メソッドをコールする

説明

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

参考

  • forward_static_call_array() - static メソッドをコールし、引数を配列で渡す
  • call_user_func_array() - パラメータの配列を指定してコールバック関数をコールする
  • call_user_func() - 最初の引数で指定したコールバック関数をコールする
  • is_callable() - 引数が、現在のスコープから関数としてコール可能な値かどうかを調べる

add a note

User Contributed Notes 2 notes

up
4
arthur dot techarts at gmail dot com
12 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
11 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