Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Closure i zapamiętanie zmiennej
Fred1485
post
Post #1





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

Ostrzeżenie: (0%)
-----


Witam, od razu przechodzę do problemu:

  1. <?php
  2.  
  3. class Product
  4. {
  5. public $name;
  6. public $price;
  7.  
  8. public function __construct($name, $price)
  9. {
  10. $this->name = $name;
  11. $this->price = $price;
  12.  
  13. echo $this->name . ': ' . 'przetwarzanie sprzedaży' . "<br>";
  14. }
  15. }
  16.  
  17. class Sale
  18. {
  19. public $callbacks = [];
  20.  
  21. public function addCallback(callable $callback)
  22. {
  23. if (is_callable($callback)) {
  24. $this->callbacks[] = $callback;
  25. }
  26. }
  27.  
  28. public function saleProduct(Product $product)
  29. {
  30. foreach ($this->callbacks as $callback) {
  31. $callback($product);
  32. }
  33. }
  34. }
  35.  
  36. class Callback
  37. {
  38. public function warnAmount($amount)
  39. {
  40. $count = 0;
  41. return function ($product) use ($amount, &$count)
  42. {
  43. $count += $product->price;
  44. echo 'suma: ' . $count . "<br>";
  45.  
  46. if ($count > $amount) {
  47. echo 'drogo! ' . $count . ' <br>';
  48. }
  49. };
  50. }
  51. }
  52.  
  53.  
  54. $processor = new Sale();
  55. $callback = new Callback();
  56. $processor->addCallback($callback->warnAmount(10));
  57.  
  58.  
  59. $processor->saleProduct(new Product('buty', 6));
  60. echo '<br>';
  61. $processor->saleProduct(new Product('kawa', 3));
  62. echo '<br>';
  63. $processor->saleProduct(new Product('chipsy', 3));
  64. echo '<br>';
  65. $processor->saleProduct(new Product('costam', 8));
  66. echo '<br>';
  67.  


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ć...

Ten post edytował Fred1485 28.11.2015, 13:01:35


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post

Posty w temacie
- Fred1485   Closure i zapamiętanie zmiennej   28.11.2015, 12:54:44
- - viking   Usuń & sprzed &$count (linia 41) i zo...   28.11.2015, 13:33:29


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 06:26