![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 56 Pomógł: 0 Dołączył: 23.11.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Ok ta kwestie jakos rozwiaze. A teraz to co tygryski lubia najbardziej czyli pytanie techniczne
![]() Core -> - db - tpl - session -- login --- auth - error_handler - page - cache - assert handler I teraz wszystkie te klasy mają być dostępne dla jądra i dla każdej innej. Więc w klasie core stworzyłem zmienna: [php:1:66d913925e]<?php class core { var $classes; function core() global $CORE; $this->classes = &$CORE; } } ?>[/php:1:66d913925e] i teraz nie muszę przekazywać po zainicjowaniu dowolnej klasy ($this->classes['db'] = new db()) jej instancji innej. zastanawia mnie tylko czy takie rozwiązanie jest dość optymalne. Aplikacja jak narazie ma działać na php 4 nad czym bardzo boleję bo na 5 było by o wiele łatwiej. Więc pytanie: czy wykorzystać inny "punkt zaczepienia" czyli np. $_GLOBALS czy $_SESSION (można by zserialiozować obiekty wszystkie) czy może istnieje inny pomysł na referencję w b. złóżonej strukturze ![]() Pozdrawiam |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 554 Pomógł: 0 Dołączył: 4.04.2002 Skąd: Tychy Ostrzeżenie: (0%) ![]() ![]() |
ostatnio mialem troche klopotu z przekazywaniem referencji z silnika do klas
rozwiazanie jest dosyc proste: - inicjujesz db w srodku engine - przekazujesz referencje do db przez [php:1:1b2371b3f3]<?php $this->db = &$GLOBALS['engine']->db; ?>[/php:1:1b2371b3f3] -------------------- "Real children don't go hoppity-skip unless they are on drugs."
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
Może cos takiego, jak poniżej?
[php:1:c089254ac3]<?php class ExampleClass1 { function ExampleClass1() { $GLOBALS['_ProjectName_ExampleClass1'] = &$this; } function Method() { // tutaj kod } } class ExampleClass2 { function ExampleClass2() { $GLOBALS['_ProjectName_ExampleClass2'] = &$this; } function Method() { // tutaj kod } } class MainClass { function MainClass() { $GLOBALS['_ProjectName_MainClass'] = &$this; $objObject1 = new ExampleClass1(); $objObject2 = new ExampleClass2(); } function Foo() { $this->x = $GLOBALS['_ProjectName_ExampleClass1']->Method() $this->y = $GLOBALS['_ProjectName_ExampleClass2']->Method() } } ?>[/php:1:c089254ac3] -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2003 Skąd: Białe Błota Ostrzeżenie: (0%) ![]() ![]() |
Nie lepiej uzyc metody Factory i Singleton/Instance?
-------------------- Piotr Usewicz
http://www.layer22.com |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2003 Skąd: Białe Błota Ostrzeżenie: (0%) ![]() ![]() |
[php:1:250efc29a6]<?php
function &singleton ( $params = array () ) { static $articles; if ( !isset ( $articles ) ) { $articles = &Articles::factory ( $params ); } return ( $articles ); } function &factory ( $params = array () ) { return ( new Articles ( $params ) ); } ?>[/php:1:250efc29a6] Teraz, jezeli chcesz uzywac jednego obiektu w calej aplikacji piszesz sobie $obiekt= &JakisObiekt::singleton(); i w dowolnym mijescu gdzie chcesz uzyc tego obiektu robisz np. $this->_db = &JakisObiekt::singleton(); -------------------- Piotr Usewicz
http://www.layer22.com |
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%) ![]() ![]() |
Raz stworzona instancja w podanym przez Ciebie przykladzie nie jest ponownie tworzon tylko przesylana (zwracana) przez referencje.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 70 Pomógł: 0 Dołączył: 22.10.2003 Skąd: Trójmiasto Ostrzeżenie: (0%) ![]() ![]() |
A ja proponuje jeszcze inaczej:
[php:1:f86601a695] <? $class1 = new Class1; $class2 = new Class2; $class3 = new Class3; // dodajemy referencje do klasy 1 $class1->AddObject('cClass2', $class2); $class1->AddObject('cClass3', $class3); // dodajemy referencje do klasy 2 $class2->AddObject('cClass1', $class1); $class2->AddObject('cClass3', $class3); // dodajemy referencje do klasy 3 $class3->AddObject('cClass1', $class1); $class3->AddObject('cClass2', $class2); // Klasy class Class1 { var $mProperty1; var $mProperty2; function CosRobieZClass2 () { $this->cClass2->JakasMetoda(); } function AddObject($pName, &$pObject) { if (false == is_object($this->$pName)) { $this->$pName = &$pObject; } } } class Class2 { function JakasMetoda() { $this->cClass1->mProperty1 = 'wartosc'; $this->cClass3->MetodaZClass3(); } function AddObject($pName, &$pObject) { if (false == is_object($this->$pName)) { $this->$pName = &$pObject; } } } // [ciach]... - nie chcialo mi sie pisac klasy 3 ?> [/php:1:f86601a695] Mam nadzieje, ze idea jest jasna - w ten sposob jest duzo referencji ale zawsze z kazdej klasy mozna sie dostac do innych. Warunkiem jest tylko, zeby kazda z klass miala metode AddObject() i mozna dzialac. Co o tym myslicie? Dodam tylko, ze tego uzywam i bardzo przyjemnie sie uzywa. Aha, mozna oczywiscie zrobic tak w srodku Class1 np. [php:1:f86601a695] <? $this->cClass2->cClass3->MetodaJakasZClass3(); ?> [/php:1:f86601a695] Oczywiscie tutaj nie ma to sensu ale w niektorych miejscach sie to przydaje. -------------------- "Use the force - read the source"
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2003 Skąd: Białe Błota Ostrzeżenie: (0%) ![]() ![]() |
mozliwe do zaakceptowania ;] ide teraz away ;]
-------------------- Piotr Usewicz
http://www.layer22.com |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 70 Pomógł: 0 Dołączył: 22.10.2003 Skąd: Trójmiasto Ostrzeżenie: (0%) ![]() ![]() |
Jak "koderzy" beda chcieli to i tak sie dostana do tego do czego nie powinni natomiast nic w moim rozwiazaniu nie zwiekszasz (pamiec minimalnie) natomiast kod jest bardziej elastyczny.
-------------------- "Use the force - read the source"
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 90 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Opole Ostrzeżenie: (0%) ![]() ![]() |
Nie trzymajcie obiektow w zmiennych typu "static".
Jest jakis problem zwracajac obiekt ktory jest w takiej zmiennej przez referencje. Jezeli cos wam zle bedzie dzialalo - dajcie obiekt do zmiennej globalnej, np: $GLOBALS['__SomeClass']; -------------------- code.gosu.pl
|
|
|
![]()
Post
#11
|
|
![]() Administrator planeta/IRC Grupa: Przyjaciele php.pl Postów: 385 Pomógł: 0 Dołączył: 19.04.2003 Skąd: Zabrze Ostrzeżenie: (0%) ![]() ![]() |
Napisałem sobie funkcje która ma za zadanie tworzyć obiekt i wrzucać go do globalsów, a następnie zwracać do niego referencje. Co myślicie o czymś takim:
[php:1:735e92d150]<?php function &newGlobalObject( $objName ) { if( !isset( $GLOBALS['_' . $objName] ) ) { $GLOBALS['_' . $objName] = new $objName; return $GLOBALS['_' . $objName]; } return false; } ?>[/php:1:735e92d150] -------------------- "Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning."
Cudi's devBlog |
|
|
![]()
Post
#12
|
|
![]() Administrator planeta/IRC Grupa: Przyjaciele php.pl Postów: 385 Pomógł: 0 Dołączył: 19.04.2003 Skąd: Zabrze Ostrzeżenie: (0%) ![]() ![]() |
Ano tak, dzięki
![]() -------------------- "Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning."
Cudi's devBlog |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2003 Skąd: Białe Błota Ostrzeżenie: (0%) ![]() ![]() |
Dobre ;] kazde rozwiazanie ktore dziala jest dobre ;]
-------------------- Piotr Usewicz
http://www.layer22.com |
|
|
![]()
Post
#14
|
|
![]() Administrator planeta/IRC Grupa: Przyjaciele php.pl Postów: 385 Pomógł: 0 Dołączył: 19.04.2003 Skąd: Zabrze Ostrzeżenie: (0%) ![]() ![]() |
Ale chodzi o to żeby było jeszcze w miare optymalne
![]() ![]() -------------------- "Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning."
Cudi's devBlog |
|
|
![]()
Post
#15
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Jezeli cos wam zle bedzie dzialalo - dajcie obiekt do zmiennej globalnej, np: $GLOBALS['__SomeClass'];
Jezeli mamy uzywac technik OOP to globale sa nie wskazane. Natomiast jezeli mamy problem z odpowiednim przekazywaniem obiektow i dostepem do nich to znaczy, ze zle zaprojektowalismy model obiektow aplikacji. |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 70 Pomógł: 0 Dołączył: 22.10.2003 Skąd: Trójmiasto Ostrzeżenie: (0%) ![]() ![]() |
Ja uwazam, ze to nie jest zle zaprojektowana aplikacja - to jest kwestia jezyka a raczej jego ograniczen - mysle, ze sie to zmieni po wejsciu php5.
Natomiast ja proponuje moje rozwiazanie - tam nie potrzeba globali ale... jesli aplikacja dziala, spelnia swoje zadanie, pisze sie ja latwo to w czym problem? Tylko dlatego, ze w jakiejs ksiazce jest napisane, ze "tak nie wolno" nie nalezy tego stosowac? Ja uwazam, ze jesli jest dobrze aplikacja napisana, przemyslana to moga nawet byc globale (zreszta sam pisze w tej chwili w firmie gdzie wszystko jest napisane z uzyciem globali - oczywiscie wszystko jest modulowe i sprawdza sie doskonale - najwazniejsza rzecza jest to, ze to dziala!) -------------------- "Use the force - read the source"
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 90 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Opole Ostrzeżenie: (0%) ![]() ![]() |
Cytat Cytat Jezeli cos wam zle bedzie dzialalo - dajcie obiekt do zmiennej globalnej, np: $GLOBALS['__SomeClass'];
Jezeli mamy uzywac technik OOP to globale sa nie wskazane. W php5 mozliwy jest juz chyba dostep statyczny do zmiennych obiektow (nie jestem pewien), wiec tam nie powinno byc problemu. Pozatym php nie jest jezykiem obiektowym tylko jezykiem proceduralnym wzbogaconym o elementy obiektowosci. eZPublish jest napisane obiektowo, a uzywaja tam setek zmiennych globalnych ... -------------------- code.gosu.pl
|
|
|
![]()
Post
#18
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%) ![]() ![]() |
ezPublish nie jest napsiany w calosci w OOP, wiec nie mozna mowic, ze skoro on uzywa globali to my tez musimy.
Natomiast to prawda, ze php jest strukturalnym jezykiem z elementami OOP, wiec nie mozna wymagac cudow od niego. Jednak stosowac pewne zalzoenia OOP mozna mimo, ze php nie bedzie tak szybkie jak w strukturalnym oraz nie bedzie np. ukrywalo metody nie publiczne (php 4 <=). |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 24.07.2025 - 11:34 |