Home » Php » PHP, The Closure class

PHP, The Closure class

Posted by: admin July 12, 2020 Leave a comment

Questions:

I am trying to understand about the closure class, at the manual there is,
All at the manual Link,

Closure::__construct – Constructor that disallows instantiation. If i understand it right the only instance of this class is for anonymous function variable assignment.

But i did not understand few lines:

Closure::bind — Duplicates a closure with a specific bound object and class scope.

Closure::bindTo — Duplicates the closure with a new bound object and class scope.

And the last at the manual i did not understand this sentence:

Besides the methods listed here, this class also has an __invoke
method. This is for consistency with other classes that implement
calling magic, as this method is not used for calling the function.

If can some one please try to explain thoes lines to me i will be very thankful, Have a nice day.

How to&Answers:

It is referring to the calling magic.

As my understanding, for any class that contains the method __invoke which its instances can be called as if it is a function. The Closure::__invoke acts like that.

i.e. when $foo is of class Closure (anonymous function), calling $foo($bar) will call $foo->__invoke(bar) (although the __invoke member is not meant to be called directly, this is just to show how it works).

When you define anonymous functions, you do this:

$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

Now, $greet is of class Closure. and $greet->__invoke is sort of equal to function($name){ printf("Hello %s\r\n", $name); }

And remember, Closure::__invoke is a Magic Method.

Answer:

I think the difference between bind and bindTo is just in the way they’re called:

$cl->bindTo($obj)

is equivalent to

Closure::bind($cl, $obj)

Regarding the __invoke meethod, it’s saying that the method exists, but it’s not actually used. When you use the closure as a function, an internal (probably more efficient) mechanism is used that bypasses the method. But the method is there for compatibility with other classes that are callable, and you could call it manually if you wanted to.