Рубрики
Uncategorized

Понять больше магических методов: __вызов статического()

Как вы знаете, магические методы – это специальные методы, которые переопределяют действие PHP по умолчанию, когда оно определено… Помечено программированием, php, магическими методами, советами по программированию.

Как вы знаете, магические методы – это специальные методы, которые переопределяют действие 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”