Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Closure i zapamiętanie zmiennej
Forum PHP.pl > Forum > PHP > Object-oriented programming
Fred1485
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ć...
viking
Usuń & sprzed &$count (linia 41) i zobacz jeszcze raz.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.