Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z obiektami w php5
Forum PHP.pl > Forum > PHP > Object-oriented programming
Balin
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.
Hammer
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]
Balin
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.
Balin
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.
Ludvik
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.
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.