Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Przekazanie klasy do innej klasy, Przekazanie klasy do innej klasy
vadergb
post
Post #1





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 10.06.2009

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


Dotychczas piszac skrypty np. chcac przekazac dostepne rzeczy z klasy obslugi bazy danych robilem to na zasadzie przekazania jej do nastepnej.

cos typu:
$klasa = news baza();
$klasa2 = news baza($klasa);

i potem np w klasa2:
  1. class klasa2 {
  2. private $mysqli;
  3. public function __construct(mysqli $mysqli) {
  4. $this->mysqli = $mysqli;
  5. }
  6. public function findAllNews() {
  7.  
  8. $result = $this->mysqli->query ( "SELECT * FROM my_news where title='DEU' limit 2" );
  9. $result_arr = array ();
  10. while ( $data = $result->fetch_object () ) {
  11. $result_arr [] = $data;
  12. }
  13. return $result_arr;
  14.  
  15. }
  16. }

Czy jest to najwydajniejszy sposob?

Czy jest mozliwosc zrobienia klasy publicznej nie uzywajac singletona?

Przy wiekszej ilosci klas do przekazania robi sie balagan:

np. trzeba przekazac klasy: obsluga bazy danych, obsluga $_POST (itp.), Klasa obslugujaca Sesje, Klasa ACL - i jeszcze kilka by sie znalazlo...
Te klasy powinny byc tak na dobra sprawe dostepne prawie wszedzie w kazdej innej klasi - Czy jest jakis inny sposob na przekazanie jej do innej klasy innym sposobem niz singleton?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
LBO
post
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Cytat
Przy wiekszej ilosci klas do przekazania robi sie balagan:


Nie jeżeli umieścisz je w jednym obiekcie. wtedy przekazujesz tylko jego.
Go to the top of the page
+Quote Post
vadergb
post
Post #3





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 10.06.2009

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


Cytat(LBO @ 17.08.2009, 13:28:12 ) *
Nie jeżeli umieścisz je w jednym obiekcie. wtedy przekazujesz tylko jego.



  1. $klasa1=new baza();
  2. $klasa3=new session();
  3. $klasa3=new acl();
  4. $klasa4=new laczklasy($klasa1, $klasa2, $klasa3);
  5. $klasa5=new controller($klasa4);


hmm czyli chodzi o cos takiego?
klasa laczklasy - laczy te klasy w jedna i przekazuje kontrollerowi?

To jest najwydajniejszy sposob(nie chodzi o szybkosc tworzenia aplikacji - wiadomo singleton ulatwia).?
Go to the top of the page
+Quote Post
Fifi209
post
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Najprościej to zrobić klasę statyczną, która będzie "pojemnikiem" na Twoje obiekty. Wtedy nic nie musisz mieć w konstruktorze jako parametr.
Go to the top of the page
+Quote Post
vadergb
post
Post #5





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 10.06.2009

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


Cytat(fifi209 @ 17.08.2009, 13:37:12 ) *
Najprościej to zrobić klasę statyczną, która będzie "pojemnikiem" na Twoje obiekty. Wtedy nic nie musisz mieć w konstruktorze jako parametr.


Zrobilem cos takiego:
  1. class join {
  2. static $vars = array ();
  3. public function __set( $index, $value) {
  4. join::$vars [$index] = $value;
  5. }
  6. }

Uzywam:
  1. $mysqli = new mysqli ( "localhost", "root", "pass", "nazwabazy" );
  2. $httprequest = new HTTPRequest ( );
  3. $template = new template ( );
  4. $join = new join();
  5. $join->template=$template;
  6. $join->httprequest=$httprequest;
  7. $join->mysqli=$mysqli;

I teraz gdy uzyje:
  1. print_r(join::$vars);

To wypisuje my wszystkie objekty gdzie chce. Mozna zrobic podzial do jakiej klasy jakie obiekty maja przychodzic.
To dobra droga?

Czy chodzi o cos innego?
Go to the top of the page
+Quote Post
Fifi209
post
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Bardziej o coś takiego:

  1. class globals {
  2.  
  3. static private $vars;
  4.  
  5. static public function _get($name) {
  6. if (isset(self::$vars[$name])) {
  7. return self::$vars[$name];
  8. }else{
  9. return false;
  10. }
  11. }
  12.  
  13. static public function _set($name, $value) {
  14. return self::$vars[$name] = $value;
  15. }
  16. }


i potem używasz w innej klasie:
  1. globals::_set('zmienna', 'test');


Ten post edytował fifi209 17.08.2009, 14:28:59
Go to the top of the page
+Quote Post
vadergb
post
Post #7





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 10.06.2009

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


Cytat(fifi209 @ 17.08.2009, 15:28:02 ) *
Bardziej o coś takiego:

  1. class globals {
  2.  
  3. static private $vars;
  4.  
  5. static public function _get($name) {
  6. if (isset(self::$vars[$name])) {
  7. return self::$vars[$name];
  8. }else{
  9. return false;
  10. }
  11. }
  12.  
  13. static public function _set($name, $value) {
  14. return self::$vars[$name] = $value;
  15. }
  16. }


i potem używasz w innej klasie:
  1. globals::_set('zmienna', 'test');


hmm ale mowimy o zapisywaniu w tej klasie objektow nie zmiennych.
zrobimy np
  1. globals::_set('obiekt1', $object);


a potem:
  1. $obiekt1=globals::_get('obiekt1');

i w $obiekt1 mamy juz obiekt ktory chcemy.

Ale jest sens pchac w to nowa klase - przez to chyba skrypt traci na wydajnosci niz jakbysmy robili to za pomoca tradycyjnej metody:

  1. $obiekt1=new obiekt();
  2. $obiekt2=new obiekt1($obiekt1);


Zalezy mi na zeby jak najbardziej to bylo wydajne. To nie ma byc pod budowe xxx stron skrypt - tylko pod budowe okreslonej strony ktora docelowa bedzie odwiedzac sporo grupa ludzi.

pozdrawiam
Go to the top of the page
+Quote Post
Fifi209
post
Post #8





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(vadergb @ 17.08.2009, 14:37:56 ) *
hmm ale mowimy o zapisywaniu w tej klasie objektow nie zmiennych.
zrobimy np
  1. globals::_set('obiekt1', $object);

No obiektów, a to że pokazałem jak zapisać zmienną to inna sprawa... Obiekt też się tam zapisze.

Cytat(vadergb @ 17.08.2009, 14:37:56 ) *
Ale jest sens pchac w to nowa klase - przez to chyba skrypt traci na wydajnosci niz jakbysmy robili to za pomoca tradycyjnej metody:

  1. $obiekt1=new obiekt();
  2. $obiekt2=new obiekt1($obiekt1);



Zalezy mi na zeby jak najbardziej to bylo wydajne. To nie ma byc pod budowe xxx stron skrypt - tylko pod budowe okreslonej strony ktora docelowa bedzie odwiedzac sporo grupa ludzi.

pozdrawiam


To zastanów się co chcesz. Powiedziałem Ci jak to prościej zrobić, ew. możesz singletona wrzucić.
Go to the top of the page
+Quote Post
marcio
post
Post #9





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


Sam loader mozna zrobic tak jak pisza wyzej za pomoca singletona ale to tez na wszystkie obiekty klas nie moze byc singleton dlatego ja uzywam wlasny import klas:

  1.  
  2. <?php
  3.  
  4. class Imports {
  5.  
  6.  
  7.  $cfg = Loader::load('Cfg');
  8.  
  9.  
  10.   private $PathImports = array(
  11.   
  12.   $cfg -> PathControllers,
  13.   $cfg -> PathLibs,
  14.   $cfg -> PathModels,
  15.   $cfg -> PathModules.$cfg -> PathControllers,
  16.   $cfg -> PathModules.$cfg -> PathModels,
  17.   $cfg -> PathModules.$cfg -> PathViews,
  18.   $cfg -> PathPlugins.$cfg -> PathControllers,
  19.   $cfg -> PathPlugins.$cfg -> PathModels,
  20.   $cfg -> PathPlugins.$cfg -> PathViews,
  21.   $cfg -> PathConfig
  22.    
  23.   
  24.   );
  25.  
  26.  public function __get($class) {
  27.  
  28.   foreach($this -> PathImports as $imports) {
  29.   
  30.   if(file_exists($imports.$class.'.php')) {
  31.   
  32.   require_once($imports.$class.'.php');
  33.  
  34.   }
  35.    
  36.   else if(file_exists($imports.$class.'_Model'.'.php')) {
  37.    
  38.   require_once($imports.$class.'_Model'.'.php');
  39.    
  40.   }
  41.  
  42.   }
  43.  
  44.  if(class_exists($class) || class_exists($class.'_Model'))
  45.  
  46.   $obj = new $class();
  47.  
  48.   
  49.   return $obj;
  50.  
  51.  }
  52.  
  53. }
  54.  
  55. ?>
  56.  
  57.  
  58.  


Gdzie glowny plik rozruchowy czyli index.php go includuje a glowny kontroler dziedziczy po tej klasie i mam dostep do kazdej klasy robiac:

  1.  
  2. $this -> Klasa -> Metoda();
  3.  
  4.  
  5.  
  6. //ewentualnie jesli klasa nie ma dziedziczyc po Klasie imports, lub mozna przekazac obiekt do jakiejs funkcji lub cos 
  7.  
  8.  
  9.  
  10. $import = new Imports;
  11.  
  12. $import -> Klasa -> metoda();
  13.  


Mnie to bardzo pasuje.

Go to the top of the page
+Quote Post
vadergb
post
Post #10





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 10.06.2009

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


hmm a jakby zrobil cos w stylu:


  1. $obiekt1=new obiekt();
  2. $obiekt2=new obiekt1($obiekt1);
  3. $obiekt3=new obiekt2($obiekt2);
  4.  


Klasy:
  1. class obiekt{
  2. public function __construct(klasa $obiekt1) {
  3.  
  4. }
  5. public function show() {
  6. echo 'a';
  7. }
  8. ...
  9. }
  10. class obiekt1{
  11. private $obiekt1;
  12. public function __construct(klasa $obiekt1) {
  13. $this->obiekt1= $obiekt1;
  14.  
  15. }
  16. ...
  17.  
  18. }
  19. class obiekt2{
  20. private $obiekt2;
  21. public function __construct(klasa $obiekt2) {
  22. $this->obiekt2= $obiekt2;
  23. $this->obiekt2->obiekt1->show();
  24. }
  25. ...
  26.  
  27. }


tylko ze potem wywolac cos z obiektu w obiekcie 2 to trzeba robic : $this->obiekt2->obiekt1->show(); co wydluza kod. Moze daloby sie go jakos skrocic?


Moze ze cos takiego:
register class
  1. <?php
  2.  
  3. Class Registry {
  4.  
  5. private $vars = array();
  6.  
  7.  
  8. public function __set($index, $value)
  9. {
  10. $this->vars[$index] = $value;
  11. }
  12.  
  13. public function __get($index)
  14. {
  15. return $this->vars[$index];
  16. }
  17.  
  18.  
  19. }
  20.  
  21. ?>

index i 3 klasy
  1. class obiekt {
  2. public $mysqli;
  3. protected $registry;
  4.  
  5. function __construct( $registry) {
  6. $this->registry = $registry;
  7.  
  8. }
  9.  
  10. }
  11. class obiekt1 {
  12. protected $registry;
  13.  
  14. function __construct( $registry) {
  15. $this->registry = $registry;
  16.  
  17. }
  18. public function show() {
  19. echo 'a';
  20. }
  21.  
  22. }
  23. class obiekt2 {
  24. protected $registry;
  25. public function __construct( $registry) {
  26. $this->registry = $registry;
  27.  
  28. }
  29. }
  30.  
  31. $registry = new registry ( );
  32. $registry->obiekt = new obiekt ( $registry );
  33. $registry->obiekt1 = new obiekt1 ( $registry );
  34.  
  35. $registry->obiekt2 = new obiekt2 ( $registry );
  36. $registry->obiekt1->show();


Dzieki temu nie musimy robic:$registry->obiekt2->obiekt1->show(); itd.
odwolujemy sie tylko $register->nazwaklasy->funkcja();

Wydaje sie pomysl z register chyba najbardziej optymalny i najlepszy. nie musimy nigdzie martwic sie o klasy. Wszedzie je mamy. Teraz pytanie czy jest on wydajny?



Ten post edytował vadergb 18.08.2009, 14:05:37
Go to the top of the page
+Quote Post
marcio
post
Post #11





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


1 sposob jest do bani.



Drugi jesli dziala jest ok i czemu nie mialby byc wydajny choc wedlug mnie i tak zabardzo masz to przekombinowane.

Go to the top of the page
+Quote Post
vadergb
post
Post #12





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 10.06.2009

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


Cytat(marcio @ 18.08.2009, 17:39:20 ) *
1 sposob jest do bani.



Drugi jesli dziala jest ok i czemu nie mialby byc wydajny choc wedlug mnie i tak zabardzo masz to przekombinowane.


Hmm dlaczego 1 sposob akurat jest do bani?

2 sposob ma duzo wspolnego z http://forum.php.pl/index.php?showtopic=122586&hl=
wiec nie wiem czy to jest dobre ... slyszalem ze singletona powinno sie omijac...
Go to the top of the page
+Quote Post
Whisller
post
Post #13





Grupa: Zarejestrowani
Postów: 77
Pomógł: 5
Dołączył: 29.03.2006
Skąd: Poznań

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


Zobacz sobie Dependency Injection - komponent symfony.
Go to the top of the page
+Quote Post

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: 16.09.2025 - 19:35