Php магический метод invoke

PHP __invoke

Summary: in this tutorial, you’ll learn about the PHP __invoke() magic method and how to use it effectively.

Introduction to the PHP __invoke() magic method

Suppose that you have a class called MyClass :

class MyClass < // . >Code language: PHP (php)

Typically, you create a new instance of the MyClass and access its methods and properties like this:

$instance = new MyClass(); $instance->methodName();Code language: PHP (php)

Or if the MyClass has static methods, you can access them using the :: operator:

MyClass::staticMethod();Code language: PHP (php)

Besides using the MyClass these ways, PHP allows you to use the object of the class as a function. For example:

$instance($arguments);Code language: PHP (php)

In this case, PHP will call the __invoke() method of the MyClass . For example:

 class MyClass < public function __invoke(. $arguments) < echo 'Called to the __invoke method'; > > $instance = new MyClass; $instance();Code language: PHP (php)
Called to the __invoke methodCode language: PHP (php)

The $instance is known as a function object or functor.

The __invoke() magic method has the following syntax:

__invoke( . $values): mixedCode language: PHP (php)

PHP will call the __invoke() magic method when you call an object as a function.

Also, the object of the class that implements the __invoke() magic method is a callable. For example:

echo is_callable($instance) ? 'yes' : 'no'; // yesCode language: PHP (php)

In this example, the $instance of the MyClass is a callable. This means that you can pass it to any function or method that accepts a callable.

Practical PHP __invoke() magic method example

Suppose that you have an array of customer data like this;

$customers = [ ['id' => 1, 'name' => 'John', 'credit' => 20000], ['id' => 3, 'name' => 'Alice', 'credit' => 10000], ['id' => 2, 'name' => 'Bob', 'credit' => 15000] ];Code language: PHP (php)

To sort the customers by name or credit, you can use the usort() function. The second parameter of the usort() function is a callable that determines the sort order:

usort(array &$array, callable $callback): bool Code language: PHP (php)

The following defines the class Comparator that implements the __invoke() magic method:

 class Comparator < private $key; public function __construct(string $key) < $this->key = $key; > public function __invoke($a, $b) < return $a[$this->key] $b[$this->key]; > >Code language: PHP (php)

The __invoke() method returns the result of the comparison of two array elements by a specified key.

To use the Comparator class, you can create a new instance of the class and pass it to the usort() function as follows:

usort($customers, new Comparator('name'));Code language: PHP (php)

This statement sorts the customers by name.

To sort the customers by credit, you can use the credit as the key like this:

usort($customers, new Comparator('credit'));Code language: PHP (php)
 class Comparator < private $key; public function __construct(string $key) < $this->key = $key; > public function __invoke($a, $b) < return $a[$this->key] $b[$this->key]; > > $customers = [ ['id' => 1, 'name' => 'John', 'credit' => 20000], ['id' => 3, 'name' => 'Alice', 'credit' => 10000], ['id' => 2, 'name' => 'Bob', 'credit' => 15000] ]; // sort customers by names usort($customers, new Comparator('name')); print_r($customers); // sort customers by credit usort($customers, new Comparator('credit')); print_r($customers);Code language: PHP (php)

Summary

  • Use the __invoke() magic method is invoked when you call an object as a function.
  • An object of a class that implements the __invoke() is known as a function object or functor. It’s also a callable.

Источник

Магические методы

Имена методов __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() и __debugInfo() зарезервированы для «магических» методов в PHP. Не стоит называть свои методы этими именами, если вы не хотите использовать их «магическую» функциональность.

PHP оставляет за собой право все методы, начинающиеся с __, считать «магическими». Не рекомендуется использовать имена методов с __ в PHP, если вы не желаете использовать соответствующий «магический» функционал.

__sleep() и __wakeup()

Функция serialize() проверяет, присутствует ли в вашем классе метод с «магическим» именем __sleep(). Если это так, то этот метод выполняется прежде любой операции сериализации. Он может очистить объект и предполагается, что будет возвращен массив с именами всех переменных объекта, который должен быть сериализован. Если метод ничего не возвращает кроме NULL , то это значит, что объект сериализован и выдается предупреждение E_NOTICE .

Замечание:

Недопустимо возвращать в __sleep() имена приватных свойств объекта в родительский класс. Это приведет к предупреждению E_NOTICE . Вместо этого вы можете использовать интерфейс Serializable.

Рекомендованное использование __sleep() состоит в завершении работы над данными, ждущими обработки или других подобных задач очистки. Кроме того, этот метод можно выполнять в тех случаях, когда нет необходимости сохранять полностью очень большие объекты.

С другой стороны, функция unserialize() проверяет наличие метода с «магическим» именем __wakeup(). Если такой имеется, то он может воссоздать все ресурсы объекта, принадлежавшие ему.

Обычно __wakeup() используется для восстановления любых соединений с базой данных, которые могли быть потеряны во время операции сериализации и выполнения других операций повторной инициализации.

Пример #1 Sleep и wakeup

class Connection
protected $link ;
private $dsn , $username , $password ;

public function __construct ( $dsn , $username , $password )
$this -> dsn = $dsn ;
$this -> username = $username ;
$this -> password = $password ;
$this -> connect ();
>

private function connect ()
$this -> link = new PDO ( $this -> dsn , $this -> username , $this -> password );
>

public function __sleep ()
return array( ‘dsn’ , ‘username’ , ‘password’ );
>

public function __wakeup ()
$this -> connect ();
>
> ?>

__toString()

Метод __toString() позволяет классу решать самостоятельно, как он должен реагировать при преобразовании в строку. Например, что напечатает echo $obj;. Этот метод должен возвращать строку, иначе выдастся неисправимая ошибка E_RECOVERABLE_ERROR .

Нельзя бросить исключение из метода __toString(). Попытка это сделать закончится фатальной ошибкой.

Пример #2 Простой пример

// Объявление простого класса
class TestClass
public $foo ;

public function __construct ( $foo )
$this -> foo = $foo ;
>

public function __toString ()
return $this -> foo ;
>
>

$class = new TestClass ( ‘Привет’ );
echo $class ;
?>

Результат выполнения данного примера:

Ранее, до PHP 5.2.0, метод __toString() вызывался только непосредственно в сочетании с функциями echo или print . Начиная с PHP 5.2.0, он вызывается в любом строчном контексте (например, в printf() с модификатором %s), но не в контекстах других типов (например, с %d модификатором). Начиная с PHP 5.2.0, преобразование объекта в строку при отсутствии метода __toString() вызывает ошибку E_RECOVERABLE_ERROR .

__invoke()

Метод __invoke() вызывается, когда скрипт пытается выполнить объект как функцию.

Замечание:

Данный метод доступен начиная с PHP 5.3.0.

Пример #3 Использование __invoke()

class CallableClass
public function __invoke ( $x )
var_dump ( $x );
>
>
$obj = new CallableClass ;
$obj ( 5 );
var_dump ( is_callable ( $obj ));
?>

Результат выполнения данного примера:

__set_state()

Этот статический метод вызывается для тех классов, которые экспортируются функцией var_export() начиная с PHP 5.1.0.

Параметр этого метода должен содержать массив, состоящий из экспортируемых свойств в виде array(‘property’ => value, . ).

Пример #4 Использование __set_state() (начиная с PHP 5.1.0)

class A
public $var1 ;
public $var2 ;

public static function __set_state ( $an_array ) // С PHP 5.1.0
$obj = new A ;
$obj -> var1 = $an_array [ ‘var1’ ];
$obj -> var2 = $an_array [ ‘var2’ ];
return $obj ;
>
>

$a = new A ;
$a -> var1 = 5 ;
$a -> var2 = ‘foo’ ;

eval( ‘$b = ‘ . var_export ( $a , true ) . ‘;’ ); // $b = A::__set_state(array(
// ‘var1’ => 5,
// ‘var2’ => ‘foo’,
// ));
var_dump ( $b );

Результат выполнения данного примера:

object(A)#2 (2) < ["var1"]=>int(5) ["var2"]=> string(3) "foo" >

__debugInfo()

Этот метод вызывается функцией var_dump() , когда необходимо вывести список свойств объекта. Если этот метод не определен, тогда будут выведены все public, protected и private свойства объекта.

Этот метод был добавлен в PHP 5.6.0.

Пример #5 Использование __debugInfo()

public function __construct ( $val ) $this -> prop = $val ;
>

public function __debugInfo () return [
‘propSquared’ => $this -> prop ** 2 ,
];
>
>

Результат выполнения данного примера:

Источник

Читайте также:  Html reset input value
Оцените статью