Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Closure i zapamiętanie zmiennej
Fred1485
post 28.11.2015, 12:54:44
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
viking
post 28.11.2015, 13:33:29
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Usuń & sprzed &$count (linia 41) i zobacz jeszcze raz.


--------------------
Go to the top of the page
+Quote Post

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 Wersja Lo-Fi Aktualny czas: 28.04.2024 - 03:43