<?php class Product { public $name; public $price; public function __construct($name, $price) { $this->name = $name; $this->price = $price; } } class Sale { public $callbacks = []; public function addCallback(callable $callback) { if (is_callable($callback)) { $this->callbacks[] = $callback; } } public function saleProduct(Product $product) { foreach ($this->callbacks as $callback) { $callback($product); } } } class Callback { public function warnAmount($amount) { $count = 0; return function ($product) use ($amount, &$count) { $count += $product->price; if ($count > $amount) { } }; } } $processor = new Sale(); $callback = new Callback(); $processor->addCallback($callback->warnAmount(10)); $processor->saleProduct(new Product('buty', 6)); $processor->saleProduct(new Product('kawa', 3)); $processor->saleProduct(new Product('chipsy', 3)); $processor->saleProduct(new Product('costam', 8));
Przykład z książki Obiekty, wzorce, narzędzia. Zaznaczam, że wszystko działa jak należy, lecz nie rozumiem pewniej zależności.
Klasa product wiadomo bez komentarza, klasa Sale zarządza callbackami podczas sprzedaży, klasa Callback generuje tylko callback. Jako parametr metody warnAmount daję liczbę, któej przekroczenie w "zakupach" wygeneruje błąd. Ale jak to się dzieje, że jak deklaruję zmienną count jako 0 to w każdym wywołaniu metody sale ona "pamięta dotychczasowy stan". Wiem, że istnieją zmienne statyczne w funkcjach, które pomiędzy wywołaniami "pamiętają" swoją wartość, ale nic takiego tutaj nie ma. Jest przkazana jako referencja w instrukcji use, ale nie potrafię tego logicznie wytłumaczyć...