serafin
23.11.2003, 22:47:58
Ok ta kwestie jakos rozwiaze. A teraz to co tygryski lubia najbardziej czyli pytanie techniczne

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

jeśli tak to jaki i czy jest dosyć szybki??
Pozdrawiam
rzseattle
24.11.2003, 12:01:15
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]
scanner
24.11.2003, 12:08:51
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]
LoPMX
27.11.2003, 18:28:18
Nie lepiej uzyc metody Factory i Singleton/Instance?
LoPMX
27.11.2003, 20:44:19
[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();
Seth
27.11.2003, 22:08:22
Raz stworzona instancja w podanym przez Ciebie przykladzie nie jest ponownie tworzon tylko przesylana (zwracana) przez referencje.
dooshek
28.11.2003, 15:37:27
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.
LoPMX
28.11.2003, 15:52:31
mozliwe do zaakceptowania ;] ide teraz away ;]
dooshek
29.11.2003, 01:11:03
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.
cagrET
29.11.2003, 23:59:44
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'];
Cudi
30.11.2003, 00:33:31
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]
Cudi
30.11.2003, 09:58:29
Ano tak, dzięki

W przyszłości mógł być z tego trudno wykrywalny bug. A pozatym jest to dobre rozwiązanie?
LoPMX
30.11.2003, 10:25:03
Dobre ;] kazde rozwiazanie ktore dziala jest dobre ;]
Cudi
30.11.2003, 10:46:44
Ale chodzi o to żeby było jeszcze w miare optymalne

Bo działałoby równie dobrze bez referencji, z tym że napewno odrobine wolniej
Seth
30.11.2003, 12:30:22
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.
dooshek
30.11.2003, 13:00:15
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!)
cagrET
30.11.2003, 22:00:49
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 ...
Seth
30.11.2003, 22:20:42
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 <=).
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.