registry probleem
Ik ben bezig met een eigen gemaakt MVC framework. Echter loop ik nu tegen een probleem aan met mijn registry class.
Het volgende is er aan de hand:
Ik heb twee database's met identieke tabellen. Alleen de data verschilt.
Nu wordt standaard in mijn code database 1 gebruikt. Deze connectie word opgeslagen in registry item 'mysql'. Nu wil ik de mogelijkheid inbouwen op database 2 te kunnen gebruiken. Dus ik dacht ik laat registry item 'mysql' naar de connectie met database 2 wijzen. Dit lijkt goed te gaan. ( als ik mijn registry print na de wijziging is hij gewijzigd )
In mijn layout heb ik een input veldje waarmee gezocht kan worden. Zodra je begint te typen krijg je onder het input veld een lijstje met mogelijkheden. Deze mogelijkheden moeten uit de database worden gehaald waarnaar 'mysql' verwijst. Echter nadat ik 'mysql' verander heb naar database 2 zoekt hij nog steeds in database 1.
Iemand een idee?
Hieronder mijn registry class:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
class registry
{
private static $_instance = null;
private static $data = array( );
function __construct( )
{
}
static function getInstance( )
{
if (!isset(self::$_instance))
self::$_instance = new self();
return self::$_instance;
}
public static function set( $key, $value )
{
$instance = self::getInstance();
$instance->data[ $key ] = $value;
}
public static function get( $key )
{
$instance = self::getInstance();
return $instance->data[ $key ];
}
}
?>
class registry
{
private static $_instance = null;
private static $data = array( );
function __construct( )
{
}
static function getInstance( )
{
if (!isset(self::$_instance))
self::$_instance = new self();
return self::$_instance;
}
public static function set( $key, $value )
{
$instance = self::getInstance();
$instance->data[ $key ] = $value;
}
public static function get( $key )
{
$instance = self::getInstance();
return $instance->data[ $key ];
}
}
?>
Update:
Ik zie net dat als ik op een link klik hij altijd database 1 selecteert.
De volgende controle werkt niet:
Code (php)
1
2
3
4
5
2
3
4
5
if( $registry->get( 'mysql' ) === false )
{
print_r( 'mysql<br/>' );
$registry->set( 'mysql', $db )
}
{
print_r( 'mysql<br/>' );
$registry->set( 'mysql', $db )
}
Er word een nieuwe registry aangemaakt als je op een link klikt of refreshed?
Iemand een oplossing?
Update 2:
Tijdelijke oplossing, opslaan in een sessie in welke database word gewerkt.
Gewijzigd op 02/08/2010 11:11:07 door - -
ik zou zelf doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
class registry {
private $m_aData = array ();
public function __construct() {
}
public function __set ( $p_sKey, $p_sValue = FALSE ) {
$this->m_aData[$p_sKey] = $p_sValue;
}
public function __get ( $p_sKey ) {
return isset ( $this->m_aData[$p_sKey] ) ? $this->m_aData[$p_sKey] : FALSE;
}
}
private $m_aData = array ();
public function __construct() {
}
public function __set ( $p_sKey, $p_sValue = FALSE ) {
$this->m_aData[$p_sKey] = $p_sValue;
}
public function __get ( $p_sKey ) {
return isset ( $this->m_aData[$p_sKey] ) ? $this->m_aData[$p_sKey] : FALSE;
}
}
Werking is vervolgens nagenoeg hetzelfde;
overigens check jij of je key bestaat met === wat inhoud of de daadwerkelijke waarde false is. ipv ( zoals ik vermoed dat je wilt ) checken of die bestaat...
Gewijzigd op 02/08/2010 14:47:32 door Sebastiaan Blaas
Mijn class is een singleton class ( klikje )
Je hebt gelijk over de set en get. Dit had ik eerst ook zo gedaan, maar was bang dat ik daar een fout had gemaakt dus toen heb ik het gewijzigd. Had dit nog niet terug veranderd.
Wat betreft de ===. Dit is precies het zelfde als de == met als enigste verschil dat de types dan ook gelijk zijn. Dus false == "false" geeft true, maar false === "false" geeft false. Ik heb zie ik een oudere registy class gepost, want in de huidige zit ook een isset check...
en wat betreft je uitleg over de === dat is mijn uitleg alleen dan duidelijker :)
Anywayz.. het stuk met de === is het enige wat ik zie als mogelijke fout.
Maar goed, bij de === zit het probleem niet...
De search lijkt een 'oude' versie van registry te gebruiken, daarnaast word er een nieuwe registry aangemaakt als er op een link geklikt word of gerefreshed word...
Maar ben nu wel ff je probleemstuk kwijt :)
Bij elke request zal die singleton opnieuw aangeroepen worden.. Maar goed wat ik al zei ben hem ff kwijt nu :)
Aan het einde van de pagina komt dan de tekst te staan, dat is het probleem.
Hij moet niet 'netjes' aan het einde van de pagina destructen ^_^
Code (php)
Waarom roep je de instance telkens opnieuw aan?
Daarnaast is $instance->data declared als een private en gebruik je static functions als normale functions
Fixed code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
class registry
{
private static $_instance = null;
private $data = array( );
private function __construct()
{
}
static public function getInstance( )
{
if(self::$_instance === null)
{
self::$_instance = new self();
}
return self::$_instance;
}
public function set( $key, $value )
{
$this->data[ $key ] = $value;
}
public function get( $key )
{
return (isset($this->data[ $key ]) ? $this->data[ $key ] : null);
}
}
/* Voorbeeld */
$reg = registry::getInstance();
$reg->set('key', 'value');
var_dump($reg->get('key'));
?>
class registry
{
private static $_instance = null;
private $data = array( );
private function __construct()
{
}
static public function getInstance( )
{
if(self::$_instance === null)
{
self::$_instance = new self();
}
return self::$_instance;
}
public function set( $key, $value )
{
$this->data[ $key ] = $value;
}
public function get( $key )
{
return (isset($this->data[ $key ]) ? $this->data[ $key ] : null);
}
}
/* Voorbeeld */
$reg = registry::getInstance();
$reg->set('key', 'value');
var_dump($reg->get('key'));
?>
Gewijzigd op 02/08/2010 16:21:02 door Bart Waarom verplicht
Dus gewoon __get(), __set() en __isset() implementeren.
Verder is deze global registry net zo fout als het gebruiken van global variabelen of $_GLOBAL.
met unset($object); zal hij meteen ge-destruct worden op de plaats dat jij dit uitvoert. Tenzij je natuurlijk zoals in uw geval nog referenties naar het object hebt (de static variable). Dit kan je weer tegenwerken door te kopieren met clone op inhoud ipv kopieren met referentie.
Tuurlijk is dat mooier, dit had ik ook eerst maar heb zoveel lopen proberen..
@Bart
Eigenlijk zelfde verhaal :p
@Hipska
Ik weet hoe unset werkt ( gebruik ik hier niet ) en ik heb een static variable die naar mijn object verwijst, maar het object lijkt te destructen aan het eind van een pagina wat ik eigenlijk niet wil..
Ik zit net te denken dat ik, wat ik probeer te bereiken, eigenlijk helemaal niet moet willen. Ik hou het wel bij mijn oplossing met de sessie, later ga ik implementeren dat er per user bijgehouden word welke database hij als laatste heeft gewerkt.
Gewijzigd op 03/08/2010 08:35:10 door - -