Door
- -
op 02-08-2010 09:43
gewijzigd op 02-08-2010 11:11
2.104 views
Heej,
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:
<?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 ];
}
}
?>
Update:
Ik zie net dat als ik op een link klik hij altijd database 1 selecteert.
ik zie even niet waarom je de klasse zo omslachtig heb geschreven ?
ik zou zelf doen:
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;
}
}
Werking is vervolgens nagenoeg hetzelfde;
if ( $registry->mysql == false ) {
// doe iets
}
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...
@Sebas
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...
Dat was in jou class niet te zien ^_^ ( singleton )
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...
Ik heb even wat tekst in mijn destruct laten printen van de registry.
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 ^_^
<?php
/* ... */
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 ];
}
/* ... */
?>
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:
<?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'));
?>
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.
@Pim
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.