Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z obiektami w php5
Balin
post 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.
Go to the top of the page
+Quote Post
Hammer
post 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]
Go to the top of the page
+Quote Post
Balin
post 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 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 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 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 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.


--------------------
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: 27.04.2024 - 09:01