Home >Backend Development >PHP Tutorial >The use of closures in PHP

The use of closures in PHP

WBOY
WBOYOriginal
2016-07-29 09:14:47953browse

Usage of closures in PHP

Example 1

<code><span><?php</span><span>/**
 * 代码中有一个Di容器用来保存<strong>对象</strong>实例,然后通过set()方法注册服务,通过get()方法获取服务。
 * 我们看到$di->set()的时候,使用了匿名函数,我们预先注册了zhangsan和lisi两个服务,这两个服务都是User类的实例,
 * 在$di->set的时候实际上并没有实例化,而是在$di->get()的时候才执行了匿名函数并将<strong>对象</strong>返回,
 * 这就实现了**按需实例化,不用则不实例化,提高效率**。
 */</span><span><span>class</span><span>Di</span> {</span><span>private</span><span>$_factory</span>;

    <span>public</span><span><span>function</span><span>set</span><span>(<span>$id</span>, <span>$value</span>)</span> {</span><span>$this</span>->_factory[<span>$id</span>] = <span>$value</span>;
    }

    <span>public</span><span><span>function</span><span>get</span><span>(<span>$id</span>)</span> {</span><span>$value</span> = <span>$this</span>->_factory[<span>$id</span>];
        <span>return</span><span>$value</span>();
    }

}

<span><span>class</span><span>User</span> {</span><span>private</span><span>$_username</span>;

    <span><span>function</span><span>__construct</span><span>(<span>$username</span> = <span>""</span>)</span> {</span><span>$this</span>->_username = <span>$username</span>;
    }

    <span><span>function</span><span>getUserName</span><span>()</span> {</span><span>return</span><span>$this</span>->_username;
    }

}

<span>//从这里开始看</span><span>$di</span> = <span>new</span> Di();
<span>$di</span>->set(<span>"zhangsan"</span>, <span><span>function</span><span>()</span> {</span><span>return</span><span>new</span> User(<span>'张三'</span>);
});
<span>$di</span>->set(<span>"lisi"</span>, <span><span>function</span><span>()</span> {</span><span>return</span><span>new</span> User(<span>"李四"</span>);
});
<span>echo</span><span>$di</span>->get(<span>"zhangsan"</span>)->getUserName();
<span>echo</span><span>$di</span>->get(<span>"lisi"</span>)->getUserName();</code>

Example 2

<code><span>/**
 * 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。
 * 其中有一个方法用来计算购物车中所有商品的总价格。该方法使用了一个closure作为回调函数。
 */</span><span><span>class</span><span>Cart</span> {</span><span>const</span> PRICE_BUTTER = <span>1.00</span>;
    <span>const</span> PRICE_MILK = <span>3.04</span>;
    <span>const</span> PRICE_EGGS = <span>6.95</span>;

    <span>protected</span><span>$products</span> = <span>array</span>();

    <span>public</span><span><span>function</span><span>add</span><span>(<span>$product</span>, <span>$quantity</span>)</span> {</span><span>$this</span>->products[<span>$product</span>] = <span>$quantity</span>;
    }

    <span>public</span><span><span>function</span><span>getQuantity</span><span>(<span>$product</span>)</span> {</span><span>return</span><span>isset</span>(<span>$this</span>->products[<span>$product</span>]) ? <span>$this</span>->products[<span>$product</span>] : <span>FALSE</span>;
    }

    <span>public</span><span><span>function</span><span>getTotal</span><span>(<span>$tax</span>)</span> {</span><span>$total</span> = <span>0.00</span>;

        <span>$callback</span> = <span><span>function</span><span>(<span>$quantity</span>, <span>$product</span>)</span><span>use</span><span>(<span>$tax</span>, &<span>$total</span>)</span> {</span><span>$pricePerItem</span> = constant(<span>__CLASS__</span> . <span>"::PRICE_"</span> . strtoupper(<span>$product</span>));
            <span>$total</span> += (<span>$pricePerItem</span> * <span>$quantity</span>) * (<span>$tax</span> + <span>1.0</span>);
        };

        array_walk(<span>$this</span>->products, <span>$callback</span>);
        <span>return</span> round(<span>$total</span>, <span>2</span>);
    }

}

<span>$my_cart</span> = <span>new</span> Cart;

<span>// 往购物车里添加条目</span><span>$my_cart</span>->add(<span>'butter'</span>, <span>1</span>);
<span>$my_cart</span>->add(<span>'milk'</span>, <span>3</span>);
<span>$my_cart</span>->add(<span>'eggs'</span>, <span>6</span>);

<span>// 打出出总价格,其中有 5% 的销售税.</span><span>print</span><span>$my_cart</span>->getTotal(<span>0.05</span>) . <span>"\n"</span>;

<span>// The result is 54.29</span></code>

The above has introduced the use of closures in PHP, including aspects of it. I hope it will be helpful to friends who are interested in PHP tutorials.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn