Problem z obiektami w php5 |
Problem z obiektami w php5 |
28.01.2004, 15:46:52
Post
#1
|
|
Grupa: Zarejestrowani Postów: 27 Pomógł: 0 Dołączył: 14.05.2003 Ostrzeżenie: (0%) |
Mam nastepujacy problem: otoz pisze sobie cos na ksztalt silnika strony, zdecydowalem sie na php5, mam klase kernel:
[php:1:7357c021bb]<?php class Kernel { public $objDB = null; public $objConfig = null; function __construct() { $this->objDB = new DB; $this->objConfig = new Config( $this ); $this->objDB->Connect( 'tutaj parametry polaczenia' ); } } ?>[/php:1:7357c021bb] Oczywiscie klasa jest bardziej rozbudowana, ale chce zilurtrowac tylko problem - jadro tworzy obiekt Config i obiekt DB - config jest pobierany z bazy danych, dlatego do obiektu Config przekazuje referencje jadra systemu, aby mogl wykonac sobie metody sterownika bazy danych. Klasa Config wyglada w uproszczeniu tak: [php:1:7357c021bb]<?php class Config { private $objKernel = null; public $arrVars = array(); function __construct( $objKernel ) { $this->objKernel = $objKernel; $this->Load(); } function Load() { $this->objKernel->objDB->Query( 'SELECT config_name, config_value FROM ' . CONFIG_TABLE ); while( $arrRow = $this->objKernel->objDB->FetchAssoc() ) { $this->arrVars[$arrRow['config_name']] = $arrRow['config_value']; } } } ?>[/php:1:7357c021bb] Wszystko wyglada w porzadku, z tym, ze wywolanie metod bazy danych z wewnatrz obiektu Config nic nie daje, jesli wywoluje je luzem, tworzac jakis nowy plik php i umieszczajac w nim kod: [php:1:7357c021bb]<?php include 'kernel.php'; $objKernel = new Kernel; $objKernel->objDB->Query('zapytanie'); $arrRow = $objKernel->objDB->FetchRow(); ?>[/php:1:7357c021bb] to wszystko jest ok, w $arrRow mam dane, ale niestety jesli proboje zrobic to samo wewnatrz jakiegos obiektu do ktorego przekazalem obiekt jadra, to nie otrzymuje zadnego wyniku. |
|
|
28.01.2004, 18:57:35
Post
#2
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 0 Dołączył: 3.01.2004 Ostrzeżenie: (0%) |
A nie lepiej zadeklarować obiekt sterujący bazą danych jako static? Wtedy byś miał możliwość odwoływania się do niego przez Kernel::$objDB z każdego miejsca...
[php:1:60b44ef94b]<?php class Kernel { static public $objDB = null; public $objConfig = null; function __construct() { Kernel::$objDB = new DB; $this->objConfig = new Config(); $this->objDB->Connect( 'tutaj parametry polaczenia' ); } } ?> [/php:1:60b44ef94b] Potem: [php:1:60b44ef94b]<?php class Config { public $arrVars = array(); function __construct() { $this->Load(); } function Load() { Kernel::$objDB->Query( 'SELECT config_name, config_value FROM ' . CONFIG_TABLE ); while( $arrRow = Kernel::$objDB->FetchAssoc() ) { $this->arrVars[$arrRow['config_name']] = $arrRow['config_value']; } } } ?>[/php:1:60b44ef94b] No i w końcu [php:1:60b44ef94b]<?php include 'kernel.php'; $objKernel = new Kernel; Kernel::$objDB->Query('zapytanie'); $arrRow = $objKernel->objDB->FetchRow(); ?>[/php:1:60b44ef94b] Możesz najyżej zadelkarować jeszcze [php:1:60b44ef94b]<?php public $obdDB2; //a potem $obdDB2 = &Kernel::$objDB; ?>[/php:1:60b44ef94b] |
|
|
28.01.2004, 19:53:16
Post
#3
|
|
Grupa: Zarejestrowani Postów: 27 Pomógł: 0 Dołączył: 14.05.2003 Ostrzeżenie: (0%) |
Moglbym, ale mam watpliwosci czy ten kod bedzie dzialal lepiej
Idzie o to, ze chcialbym sie dowiedziec dlaczego te metody nie dzialaja wywolane z wewnatrz innego obiektu, a dzialaja wywolane 'luzem', i co zrobic, zeby dzialaly poprawnie w obu przypadkach. |
|
|
1.02.2004, 09:49:29
Post
#4
|
|
Grupa: Zarejestrowani Postów: 27 Pomógł: 0 Dołączył: 14.05.2003 Ostrzeżenie: (0%) |
Hmm, zbadalem troche sprawe, i okazalo sie, ze klopoty sa tylko z wykonaniem funkcji mysql_query z obiektu sterownika. Sprecyzuje bardziej swoje pytanie:
Dlaczego ten kod działa dobrze: [php:1:f71035654e]<?php // plik index.php include 'kernel.php'; $objKernel = new Kernel; $objKernel->objDB->Query( 'SELECT nazwisko FROM osoby WHERE imie='Marcin'' ); // to zadziala // tutaj dalszy kod ?>[/php:1:f71035654e] A ten kod nie dziala dobrze : [php:1:f71035654e]<?php // jakas klasa class Test { private $objKernel; function __construct( $objKernelRef ) { $this->objKernel = $objKernelRef; $this->TestFunc(); } function TestFunc() { $this->objKernel->objDB->Query( 'SELECT nazwisko FROM osoby WHERE imie='Marcin'' ); // to nie dziala // tutaj jakis dalszy kod } } ?>[/php:1:f71035654e] Jak wy to widzicie ? jesli dobrze pamietam, to w php 4.x robilem takie rzeczy i dzialalo ok. |
|
|
15.06.2004, 19:47:18
Post
#5
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) |
Nie szukałem informacji o tym, ale sam robiłem system, który bazował na wielokrotnej agregacji i także nie działało. Myślę, że wina nie leży po stronie kodu, tylko po stronie języka. Jeżeli się mylę to skorygujcie mnie, bo sam bym chętnie się dowiedział jak to działa.
-------------------- |
|
|
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 04:01 |