Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> sprawa referencji w obiektach
serafin
post 23.11.2003, 22:47:58
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 smile.gif CMS pisze pod php 4. I teraz sprawa referencji. Mam następującą strukturę

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 questionmark.gif jeśli tak to jaki i czy jest dosyć szybki??

Pozdrawiam
Go to the top of the page
+Quote Post
rzseattle
post 24.11.2003, 12:01:15
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."
Go to the top of the page
+Quote Post
scanner
post 24.11.2003, 12:08:51
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]


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
LoPMX
post 27.11.2003, 18:28:18
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?


--------------------
Go to the top of the page
+Quote Post
LoPMX
post 27.11.2003, 20:44:19
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();


--------------------
Go to the top of the page
+Quote Post
Seth
post 27.11.2003, 22:08:22
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.
Go to the top of the page
+Quote Post
dooshek
post 28.11.2003, 15:37:27
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"
Go to the top of the page
+Quote Post
LoPMX
post 28.11.2003, 15:52:31
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 ;]


--------------------
Go to the top of the page
+Quote Post
dooshek
post 29.11.2003, 01:11:03
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"
Go to the top of the page
+Quote Post
cagrET
post 29.11.2003, 23:59:44
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
Go to the top of the page
+Quote Post
Cudi
post 30.11.2003, 00:33:31
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
Go to the top of the page
+Quote Post
Cudi
post 30.11.2003, 09:58:29
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 smile.gif W przyszłości mógł być z tego trudno wykrywalny bug. A pozatym jest to dobre rozwiązanie?


--------------------
"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
Go to the top of the page
+Quote Post
LoPMX
post 30.11.2003, 10:25:03
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 ;]


--------------------
Go to the top of the page
+Quote Post
Cudi
post 30.11.2003, 10:46:44
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 winksmiley.jpg Bo działałoby równie dobrze bez referencji, z tym że napewno odrobine wolniej winksmiley.jpg


--------------------
"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
Go to the top of the page
+Quote Post
Seth
post 30.11.2003, 12:30:22
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.
Go to the top of the page
+Quote Post
dooshek
post 30.11.2003, 13:00:15
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"
Go to the top of the page
+Quote Post
cagrET
post 30.11.2003, 22:00:49
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
Go to the top of the page
+Quote Post
Seth
post 30.11.2003, 22:20:42
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 <=).
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 11:34