Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekazanie klasy do innej klasy
Forum PHP.pl > Forum > PHP > Object-oriented programming
vadergb
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?
LBO
Cytat
Przy wiekszej ilosci klas do przekazania robi sie balagan:


Nie jeżeli umieścisz je w jednym obiekcie. wtedy przekazujesz tylko jego.
vadergb
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).?
Fifi209
Najprościej to zrobić klasę statyczną, która będzie "pojemnikiem" na Twoje obiekty. Wtedy nic nie musisz mieć w konstruktorze jako parametr.
vadergb
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?
Fifi209
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');
vadergb
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
Fifi209
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ć.
marcio
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.

vadergb
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?

marcio
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.

vadergb
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...
Whisller
Zobacz sobie Dependency Injection - komponent symfony.
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.