Как вы знаете, магические методы – это специальные методы, которые переопределяют действие PHP по умолчанию, когда над объектом выполняются определенные действия. Следующие имена методов считаются магическими: __construct() , __destruct() , __вызов() , __вызов статического() , __get() , __set() , __isset() , __unset() , __сон() , __пробуждение() , __сериализация() , __отменить сериализацию() , __toString() , __вызвать() , __установить_состояние() , __клонировать() и __Debuginfo() . Все магические методы, за исключением __construct() , __destruct() и __clone() , должны быть объявлены общедоступными, в противном случае выдается предупреждение E_WARNING.
__callStatic() – это перегрузка метода, срабатывающая при вызове недоступных методов в статическом контексте.
public static __callStatic(string $name, array $arguments): mixed
Аргумент $name – это имя вызываемого метода. Аргумент $arguments представляет собой перечислимый массив, содержащий параметры, переданные методу $name ‘ed.
Что касается __callStatic() , вы можете вызвать метод с помощью двойного двоеточия и переименовать функции в короткие/красивые имена
class Str
{
/**
* Shortcut methods
*/
private static $methods = [
'chunk' => 'chunk_split',
'split' => 'str_split',
'length' => 'strlen',
'reverse' => 'strrev',
'countWord' => 'str_word_count',
];
/**
* Trigger when invoking inaccessible methods in a static context
*/
public static function __callStatic(string $method, array $parameters)
{
if (!array_key_exists($method, self::$methods)) {
throw new Exception('The ' . $method . ' is not supported.');
}
return call_user_func_array(self::$methods[$method], $parameters);
}
/**
* Parse query string to varaibles
*/
public static function parse(string $str)
{
parse_str($str, $output);
return $output;
}
}
$data = "Happy New Year!";
$countWord = Str::countWord($data, 1);
var_dump($countWord);
$queryStr = "first=value&arr[]=foo+bar&arr[]=baz";
$output = Str::parse($queryStr);
var_dump($output);
class Arr
{
/**
* Shortcut methods
*/
private static $methods = [
'search' => 'array_search',
'chunk' => 'array_chunk',
'combine' => 'array_combine',
'count' => 'array_count_values'
];
/**
* Trigger when invoking inaccessible methods in a static context
*/
public static function __callStatic(string $method, array $parameters)
{
if (!array_key_exists($method, self::$methods)) {
throw new Exception('The ' . $method . ' is not supported.');
}
return call_user_func_array(self::$methods[$method], $parameters);
}
/**
* Count all elements in an array
*/
public static function length(array $arr)
{
return count($arr);
}
}
$arr = [1,2,3,4,5];
$arr2 = [9,8,7,6,5];
$rs = Arr::combine($arr, $arr2);
var_dump($rs);
$length = Arr::length($arr);
var_dump($length);
Другой способ использует этот метод перегрузки, чтобы вы могли определить свою собственную функцию без статического ключевое слово, доступ с помощью двойного двоеточия. Однако этот способ ограничивает необходимость определения методов как защищенный
class Helper
{
/**
* __callStatic
* @param string $method
* @param mixed $args
* @return void
*/
public static function __callStatic($method, $args) {
$called = get_called_class();
$class = new $called();
return $class->$method(...$args);
}
protected function generateToken($length)
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
}
$result = Helper::generateToken(10);
var_dump($result);
Оригинал: “https://dev.to/ngodinhcuong/understand-more-magic-methods-callstatic-2828”