Use keyword in functions - PHP

51,669

Solution 1

The use of "use" is correct in this case too.

With closures, to access variables that are outside of the context of the function you need to explicitly grant permission to the function using the use function. What it means in this case is that you're granting the function access to the $tax and $total variables.

You'll noticed that $tax was passed as a parameter of the getTotal function while $total was set just above the line where the closure is defined.

Another thing to point out is that $tax is passed as a copy while $total is passed by reference (by appending the & sign in front). Passing by reference allows the closure to modify the value of the variable. Any changes to the value of $tax in this case will only be effective within the closure while the real value of $total.

Solution 2

When you declare an anonymous function in PHP you need to tell it which variables from surrounding scopes (if any) it should close over — they don't automatically close over any in-scope lexical variables that are mentioned in the function body. The list after use is simply the list of variables to close over.

Solution 3

This means your inner function can use variables $tax and $total from the outer function, not only its parameters.

Share:
51,669

Related videos on Youtube

Tarik
Author by

Tarik

I am a software engineer with interests in different technologies.

Updated on June 12, 2020

Comments

  • Tarik
    Tarik almost 4 years

    Possible Duplicate:
    In Php 5.3.0 what is the Function “Use” Identifier ? Should a sane programmer use it?

    I've been examining the Closures in PHP and this is what took my attention:

    public function getTotal($tax)
        {
            $total = 0.00;
    
            $callback =
                function ($quantity, $product) use ($tax, &$total)
                {
                    $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                        strtoupper($product));
                    $total += ($pricePerItem * $quantity) * ($tax + 1.0);
                };
    
            array_walk($this->products, $callback);
            return round($total, 2);
        }
    

    And somebody please give me an explanation about the usage of use in this code.

    function ($quantity, $product) use ($tax, &$total)
    

    When I search use in PHP, it finds use keyword where it is used in namespaces but here it looks different.

    Thanks.

    • shinkou
      shinkou almost 13 years
      Exactly same question here.
    • Petruza
      Petruza over 8 years
      Commenting /* use ($tax, &$total) */ would have answered the question. Dare to explore :)
  • Tarik
    Tarik almost 13 years
    Thanks for pointing out the pass-by-reference part. I didn't notice it at all..
  • Michael
    Michael over 7 years
    To add. Arrays are also passed by copy. But in PHP it is lazy copy. This means that it is only copied if you start making changes to it. Point, you don't have to worry about performance.
  • Dhirender
    Dhirender over 7 years
    Hi, Thanks for your explanation. But I have a little query that we can also pass the variables defined outside the scope as argument to closure. then why we use "use" keyword to do the same thing.