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();
?>
forward_static_call
(PHP 5 >= 5.3.0)
forward_static_call — Appelle une méthode statique
Description
Appelle une fonction ou une méthode utilisateur, nommée function,
avec les arguments qui suivent. Cette fonction doit être appelée depuis une méthode,
et ne peut pas être utilisée hors d'une classe.
Elle utilise le liage statique.
Liste de paramètres
-
function -
La fonction ou la méthode appelée. Ce paramètre peut être un tableau, avec le nom de la classe et de la méthode, ou une chaîne, avec le nom de la fonction.
-
parameter -
Zéro ou plusieurs paramètres à passer à la fonction.
Valeurs de retour
Retourne le résultat de la fonction, ou bien FALSE en cas d'erreur.
Exemples
Exemple #1 Exemple avec 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'), 'encore', 'args');
forward_static_call( 'test', 'autres', 'args');
}
}
B::test('foo');
function test() {
$args = func_get_args();
echo "C ".join(',', $args)." \n";
}
?>
L'exemple ci-dessus va afficher :
B B encore,args C autres,args
Voir aussi
- forward_static_call_array() - Appelle une méthode statique et passe les arguments en tableau
- call_user_func_array() - Appelle une fonction de rappel avec les paramètres rassemblés en tableau
- call_user_func() - Appelle une fonction de rappel fournie par le premier argument
- is_callable() - Détermine si l'argument peut être appelé comme fonction
- Informations sur le type callback
jhibbard at gmail dot com ¶
10 months ago
arthur dot techarts at gmail dot com ¶
1 year 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>';
?>
