Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: leniwe definicje
Forum PHP.pl > Forum > PHP
acidm
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.
Mlodycompany
wzorzec fabryki powinien Ci chyba rozwiązać problem
acidm
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. }
nospor
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ż.
acidm
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?
nospor
No to ci mowie: wynik sprawdzania zapisz do zmiennej.
YourFrog
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') );
acidm
Dziękuję panowie smile.gif
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.