Новая версия PHP предоставила новый метод, известный как "__callStatic()", который работает так же, как "__call()", но, как вы уже догадались, он является статическим. В данном методе используется оператор видимости "::" в отличии от метода "__call()" в котором он запрещён, и так же не допускается оператор "->".
Приведём пример работы:
class _byCallStatic
{
public static function __callStatic($_name, $_param)
{
return 'Название метода: <b>'. $_name .'</b><br>
Аргументы метода: <pre>'. var_export($_param, true) .'</pre>
Массив аргументов метода: <pre>'. var_export(func_get_args(), true) .'</pre>
<b>'. implode('-', $_param) .'</b>';
}
/*
* При использование спецификатора доступа "private" или "protected" данный метод вызван не будет т.к его перехватит метод "__callStatic()",
* но при использование спецификатора доступа "public" данный метод задействуется.
* Но и данный случай можно обойти.
*/
private static function _newCall(){ echo 'Method: '. __METHOD__; }
}
echo _byCallStatic::_newCall(114, 'Integer', 157);
Результат:
Название метода: _newCall
Аргументы метода:
array (
0 => 114,
1 => 'Integer',
2 => 157,
)
Массив аргументов метода:
array (
0 => '_newCall',
1 =>
array (
0 => 114,
1 => 'Integer',
2 => 157,
),
)
114-Integer-157
Сейчас продемонстрируем обход закрытых метов класса:
class _byCallStatic
{
/* Пример обхода "закрытых" методов класса, при использовании метода "__callStatic()",
* как препроцессора для вызова статического метода.
*/
public static function __callStatic($_name, $_param) { return call_user_func_array('static::'. $_name, $_param); }
private static function _newCall(){ echo 'Method: '. __METHOD__; }
}
echo _byCallStatic::_newCall(114, 'Integer', 157); # Результат: Method: _byCallStatic::_newCall
08 июля 2012,
5176
5176