Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z obiektami w php5
Balin
post
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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Hammer
post
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]
Go to the top of the page
+Quote Post
Balin
post
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 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
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.
Go to the top of the page
+Quote Post
Balin
post
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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) :
[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.
Go to the top of the page
+Quote Post
Ludvik
post
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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 07:51