Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> leniwe definicje
acidm
post 7.03.2014, 13:22:16
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 3
Dołączył: 12.03.2011
Skąd: Opole

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


Czy da się jakoś zaimplementować leniwe definiowanie w php?Mianowicie chciałbym aby metoda statyczna klasy w zależności od pewnych ustawień miała inną definicję ale ,sprawdzenie tych ustawień i redeklaracja (a raczej mechanizm ją zastępujący)była wykonywana tylko jeden raz.
Go to the top of the page
+Quote Post
Mlodycompany
post 7.03.2014, 14:29:04
Post #2





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


wzorzec fabryki powinien Ci chyba rozwiązać problem
Go to the top of the page
+Quote Post
acidm
post 11.03.2014, 09:41:16
Post #3





Grupa: Zarejestrowani
Postów: 110
Pomógł: 3
Dołączył: 12.03.2011
Skąd: Opole

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


W jaki sposób , możesz zaprezentować coś?

Myślałem żeby osiągnąć cel w ten sposób:

  1. function Mbucfirst($str)
  2. {
  3. static $a = '';
  4.  
  5. if (empty($a))
  6. {
  7. if (extension_loaded('mbstring'))
  8. {
  9.  
  10. $a = function($str)
  11. {
  12. return mb_strtoupper(mb_substr($str, 0, 1, 'UTF-8'), 'UTF-8') . mb_strtolower(mb_substr($str, 1, null, 'UTF-8'), 'UTF-8');
  13. };
  14. }
  15. else
  16. {
  17. $a = ucfirst($str);
  18. }
  19. }
  20.  
  21.  
  22. return $a($str);
  23. }
  24.  


i to nawet działa ,ale gdy przepisałem na statyczną funkcje obiektu to mam już problemy:

  1. class Mb
  2. {
  3.  
  4. public static$a;
  5.  
  6. public static function ucfirst($str)
  7. {
  8. if (empty(self::$a))
  9. {
  10. if (extension_loaded('mbstring'))
  11. {
  12.  
  13. self::$a = function($str)
  14. {
  15. return mb_strtoupper(mb_substr($str, 0, 1, 'UTF-8'), 'UTF-8') . mb_strtolower(mb_substr($str, 1, null, 'UTF-8'), 'UTF-8');
  16. };
  17. }
  18. else
  19. {
  20. self::$a = ucfirst($str);
  21. }
  22. }
  23.  
  24.  
  25. return self::$a($str);
  26. }
  27.  
  28. }
Go to the top of the page
+Quote Post
nospor
post 11.03.2014, 09:47:46
Post #4





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6296
Dołączył: 27.12.2004




1)
$a = ucfirst($str);
To nie jest zdefiniowanie, że zmienna $a bedzie teraz funkcją ucfirst. To jest przypisanie do zmiennej $a wyniku ucfirst; Tak wiec kod:
return $a($str);
jest nieprawidlowy

2) Te jednokrotne sprawdzenie tak czy siak bedzie dotyczylo tylko i wylącznie tego jednego żądania.

3) Po co ci to w ogole? By zamiast 5 razy, tylko raz sprawdzic if (extension_loaded('mbstring')) ? Przerost formy nad trescią.

Wynik extension_loaded('mbstring') mozesz zapamietac w jakiejsc zmiennej i już.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
acidm
post 11.03.2014, 09:57:15
Post #5





Grupa: Zarejestrowani
Postów: 110
Pomógł: 3
Dołączył: 12.03.2011
Skąd: Opole

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


Potrzebuję aby sprawdzanie było wykonane tylko raz , zamiast przy każdym wywołaniu.
Ten przykład akurat jest przerostem formy , ale gdy warunków jest już więcej to po co wykonywać za każdym razem sprawdzanie jakby można raz?
Go to the top of the page
+Quote Post
nospor
post 11.03.2014, 09:59:39
Post #6





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6296
Dołączył: 27.12.2004




No to ci mowie: wynik sprawdzania zapisz do zmiennej.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
YourFrog
post 11.03.2014, 10:03:23
Post #7





Grupa: Zarejestrowani
Postów: 124
Pomógł: 22
Dołączył: 10.01.2014

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


Wydaje mi się że w 1 poście dostałeś odpowiedź użyj fabryki i po problemie.

  1. <?php
  2.  
  3. /**
  4.  * Interfejs zapewniający nam to samo API klas
  5.  * @Author Paweł Stelmasiak <YourFrog>
  6.  */
  7. interface IString
  8. {
  9. public function ucfirst($str);
  10. }
  11.  
  12. /**
  13.  * Klasa obsługująca stringi MB (multibyte)
  14.  * @Author Paweł Stelmasiak <YourFrog>
  15.  */
  16. class StringMB implements IString
  17. {
  18. public function ucfirst($str)
  19. {
  20. return mb_strtoupper(mb_substr($str, 0, 1, 'UTF-8'), 'UTF-8') . mb_strtolower(mb_substr($str, 1, null, 'UTF-8'), 'UTF-8');
  21. }
  22. }
  23.  
  24. /**
  25.  * Klasa obsługująca standardowo stringi
  26.  * @Author Paweł Stelmasiak <YourFrog>
  27.  */
  28. class String implements IString
  29. {
  30. public function ucfirst($str)
  31. {
  32. return ucfirst($str);
  33. }
  34. }
  35.  
  36. /**
  37.  * Fabryka decydująca o rodzaju wykorzystywanej klasy stringów
  38.  * @Author Paweł Stelmasiak <YourFrog>
  39.  */
  40. class StringFactory
  41. {
  42. static protected $instance = null;
  43.  
  44. /**
  45. * Zwraca odpowiednią klasę
  46. * @return IString
  47. */
  48. static public function build()
  49. {
  50. if( self::$instance === null )
  51. {
  52. if( extension_loaded('mbstring') )
  53. self::$instance = new StringMB();
  54. else
  55. self::$instance = new String();
  56. }
  57.  
  58. return self::$instance;
  59. }
  60. }
  61.  
  62.  
  63.  
  64.  
  65. //Gdzieś w pliku php
  66. $string = StringFactory::build();
  67. var_dump($string->ucfirst('ala ma kota') );


Ten post edytował YourFrog 11.03.2014, 10:08:51
Go to the top of the page
+Quote Post
acidm
post 11.03.2014, 10:30:26
Post #8





Grupa: Zarejestrowani
Postów: 110
Pomógł: 3
Dołączył: 12.03.2011
Skąd: Opole

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


Dziękuję panowie smile.gif
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: 27.04.2024 - 08:06