Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Controller - co lepsze?, getInstance(), czy przekazywanie obiektom...
Prph
post
Post #1





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Witam,

Co jest lepszym rozwiazaniem? Singletone, czy przekazywanie go obiektom?
Dla przykladu:

  1. <?php
  2. // 1 rozwiazanie, klasa akcji:
  3.  
  4. public function execute(IController $oController)
  5. {
  6. $oController->.......;
  7. }
  8.  
  9. // 2 rozwiazanie, klasa akcji:
  10.  
  11. public function execute()
  12. {
  13. $oController = Controller::getInstance();
  14. $oController->.......;
  15. }
  16. ?>


Adrian.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Bora
post
Post #2





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 15.06.2003

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


Może warto zastosować tutaj rozwiązanie z javy? Np inversion of control (injection)
Kod
[Class1]
dep=Class2,Class4
singleton=true
[Class2]
singleton=true
[Class3]
singleton=true
[Class4]
singleton=true


Kod:
  1. <?php
  2. function getmicrotime(){
  3.  list($usec, $sec) = explode(" ",microtime());
  4.  return ((float)$usec + (float)$sec);
  5. }
  6. function dump($val){
  7. /*
  8. echo '<pre>';
  9. var_dump($val);
  10. echo '</pre>';
  11. */
  12. }
  13. function endTime($startTime){
  14. return getmicrotime() - $startTime;
  15. }
  16.  
  17. class Manager{
  18. protected $config = NULL;
  19. protected $contener = array();
  20. public function __construct(){
  21. $this->config = parse_ini_file("config.ini", true);
  22. }
  23. public function create($name){
  24. if(isset($this->contener[$name])){
  25. return $this->contener;
  26. }
  27. if(!isset($this->config[$name])){
  28. throw new ClassNotExistException($name);
  29. }
  30. $class = new $name();
  31. if(isset($this->config[$name]['dep'])){
  32. $deps = explode(',', $this->config[$name]['dep']);
  33. foreach($deps as $dep){
  34. $method = 'set'.$dep;
  35. $class->$method($this->create($dep));
  36. }
  37. }
  38. if(!empty($this->config[$name]['singleton'])){
  39. $this->contener[$name] = $class;
  40. }
  41. return $class;
  42. }
  43. }
  44.  
  45. class Class1{
  46. private $c2 = NULL;
  47. private $c4 = NULL;
  48. public function setClass2($c2){
  49. $this->c2 = $c2;
  50. }
  51. public function setClass4($c4){
  52. $this->c4 = $c4;
  53. }
  54. private static $_instance ; 
  55. public static function GetInstance() { 
  56. if (!isset(self::$_instance)){ 
  57. self::$_instance = new Class1() ; 
  58. } 
  59. return self::$_instance; 
  60. }
  61. }
  62. class Class2{
  63. private static $_instance ; 
  64. public static function GetInstance() { 
  65. if (!isset(self::$_instance)){ 
  66. self::$_instance = new Class2() ; 
  67. } 
  68. return self::$_instance; 
  69. }
  70. }
  71. class Class3{
  72. private static $_instance ; 
  73. public static function GetInstance() { 
  74. if (!isset(self::$_instance)){ 
  75. self::$_instance = new Class3() ; 
  76. } 
  77. return self::$_instance; 
  78. }
  79. }
  80. class Class4{
  81. private static $_instance ; 
  82. public static function GetInstance() { 
  83. if (!isset(self::$_instance)){ 
  84. self::$_instance = new Class4() ; 
  85. } 
  86. return self::$_instance; 
  87. }
  88. }
  89. class ClassNotExistException extends Exception{};
  90. $startTime = getmicrotime();
  91. $manager = new Manager();
  92. for ($i = 0; $i < 100; $i++) {
  93. try{
  94. dump($manager->create('Class2'));
  95. dump($manager->create('Class4'));
  96. dump($manager->create('Class1'));
  97. }catch(ClassNotExistException $e){
  98. dump($e->getMessage());
  99. }
  100. }
  101. echo "Czas:".endTime($startTime).' (menager)<br/>';
  102.  
  103. $startTime = getmicrotime();
  104. for ($i = 0; $i < 100; $i++) {
  105. $c2 = new Class2();
  106. $c4 = new Class4();
  107. $c1 = new Class1();
  108. $c1->setClass2($c2);
  109. $c1->setClass4($c4);
  110. dump($c2);
  111. dump($c4);
  112. dump($c1);
  113. }
  114. echo "Czas:".endTime($startTime).' (single)<br/>';
  115.  
  116. $startTime = getmicrotime();
  117. for ($i = 0; $i < 100; $i++) {
  118. $s2 = Class2::GetInstance();
  119. $s4 = Class4::GetInstance();
  120. $s1 = Class1::GetInstance();
  121. $c1->setClass2($c2);
  122. $c1->setClass4($c4);
  123. dump($c2);
  124. dump($c4);
  125. dump($c1);
  126. }
  127. echo "Czas:".endTime($startTime).' (instance)<br/>';
  128. ?>


Co ciekawe działa podobnie szybko jak za każdym razem używać jawnie wywołania instancji, jedynie troszke dłużej trwa wczytywanie ini.

Czasy u mnie na lh:
Czas:0.0023281574249268 (menager)
Czas:0.0016329288482666 (single)
Czas:0.0024371147155762 (instance)


W javie (spring) działa to pięknie ale php z racji tworzenia od 0 za każdym wywołaniem czasami może warto poprostu nie przekombinować i tak wyszukane rozwiązania zostawić w spokoju.
Nie korzystałem z tego jeszcze w żadnym projekcie bo ostatnio nie robie wiele w php i stworzyłe tylko z ciakawości czy sie wogóle uda.

Ten post edytował Bora 5.07.2006, 00:59:55
Go to the top of the page
+Quote Post

Posty w temacie
- Prph   Controller - co lepsze?   2.07.2006, 08:15:40
- - Ludvik   Lepiej przekazywać jako argument funkcji. Pytanie ...   2.07.2006, 09:45:53
- - Prph   Dlaczego? Zobacz Mojavi - tam wszedzie sie tak rob...   2.07.2006, 10:42:35
- - anas   Hej. Wydaje mi się że dużo lepiej jest przekazywa...   2.07.2006, 10:47:10
- - Prph   Z drugiej strony czesc obiektow otrzymuje w kontru...   2.07.2006, 12:23:42
- - orson   witam Jestem w trakcie kończenia innego rozwiązan...   2.07.2006, 12:34:46
- - Ludvik   Skoro tak musisz robić, to bym się skłaniał do prz...   2.07.2006, 12:45:42
- - Prph   Owszem, kontroler Mojavi ma troche skomplikowanego...   2.07.2006, 15:07:41
- - anas   @orson: czy Twoje rozwiazanie to cos na zasadzie I...   2.07.2006, 17:02:39
- - orson   witam Niestety nie jest to IoC :/ może kiedyś Za...   2.07.2006, 18:15:27
- - bigZbig   @orson - byłbym wdzięczny gdybyś pr...   3.07.2006, 10:47:17
|- - Prph   Cytat(bigZbig @ 3.07.2006, 09:47 ) @Prph ...   3.07.2006, 14:27:10
- - Ludvik   Podpisuję się pod drugim pytaniem bigZbiga. W ten ...   3.07.2006, 11:12:08
- - Cysiaczek   W zasadzie, to ja też chciałbym przeczytac opinie ...   3.07.2006, 11:36:35
- - orson   witam @bigZbig: to jest rozwiązanie generalne. Po...   3.07.2006, 11:44:00
- - anas   Hej. Również uważam, że bez sensu ...   3.07.2006, 11:48:35
- - NuLL   CytatCo myślicie o takim podejściu?Podej...   3.07.2006, 11:57:30
- - Cysiaczek   Wydaje mi się, że samo przekazanie obiektu kontrol...   3.07.2006, 12:14:57
- - bigZbig   Myślę, że tu jest generalnie proble...   3.07.2006, 13:18:28
- - NuLL   Prosty quiz [PHP] pobierz, plaintext <?php...   3.07.2006, 17:52:55
|- - Prph   Cytat(NuLL @ 3.07.2006, 16:52 ) Bo wg mni...   4.07.2006, 01:31:37
- - splatch   Ej, panowie, ale chyba znacie definicje Front Cont...   3.07.2006, 19:54:12
- - Bora   Może warto zastosować tutaj rozwiązanie z javy? Np...   5.07.2006, 00:46:42
- - Ludvik   Hm... muszę przynać, że ciekawie to wygląda i nawe...   5.07.2006, 08:44:07
- - Sh4dow   Moim zdaniem wszystko zalezy od konstrukcji aplika...   6.07.2006, 11:17:08
- - Cysiaczek   Ale czy w tym wypdku o którym mówisz Sh4dow, to ni...   6.07.2006, 14:34:51
- - bigZbig   @Cysiaczek - jesli to jet klasa Singleton (poprawn...   6.07.2006, 14:42:44
- - Cysiaczek   Tak. Zdaję sobie z tego sprawę - mimo to zastanawi...   6.07.2006, 14:47:43
- - bigZbig   Ale w czym problem? Zalezy od ciebie czy przekazes...   6.07.2006, 14:55:33
- - Cysiaczek   Aha. Własnie do tego zmierzałem - po co "psuć...   6.07.2006, 15:07:49
- - splatch   Singleton jest zły. Dlaczego? Jest to niemalże to ...   6.07.2006, 18:15:53
- - Bora   podejrzewam że IoC może sie nie podobać osobom któ...   6.07.2006, 19:36:24


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

 



RSS Aktualny czas: 10.10.2025 - 03:06