Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z fabryka klas
Forum PHP.pl > Forum > PHP
rzseattle
Mam maly problem z fabryka klas ktora tworzy mi nowe obiekty przy kazdej probie zaladowania obiektu kiedy ja chce otrzymac tylko jedna instancje obiektu niezaleznie od ilosci wywolan. Moze odrobine kodu.

Kod testowy:[php:1:f566288767]<?php
$x =& engine::loadExtinsion('Smarty', 'smarty/');

pa($x->_tpl_vars);
$x->_tpl_vars['aaa'] = "aaa";

$y =& engine::loadExtinsion('Smarty', 'smarty/');

$y->_tpl_vars['bbb'] = "bbb";

pa($x->_tpl_vars);

pa($y->_tpl_vars);

print '<hr>';

$a = &smarty::singleton();

$a->_tpl_vars = array();

$a->_tpl_vars['aaa'] = 'aaa';

$b = &smarty::singleton();

$b->_tpl_vars['bbb'] = 'bbb';

pa($a->_tpl_vars);
?>[/php:1:f566288767]
wynik:
Kod
Array

(

    [SCRIPT_NAME] => /phpbb/index.php

)



Array

(

    [SCRIPT_NAME] => /phpbb/index.php

    [aaa] => aaa

)



Array

(

    [SCRIPT_NAME] => /phpbb/index.php

    [bbb] => bbb

)

_______________________________________

Array

(

    [aaa] => aaa

    [bbb] => bbb

)


Jak pokazuje test przyczyna nie tkwi po stronie samego singletonu tylko po stronie metody loadExtinsion ktora jest wlasciwie aliasem do fabryki [php:1:f566288767]<?php
function &factory( $class, $type = "core" , $subDir ='') {

$class_ = (class_exists($class)) ? $class : engine::_autoloadClass($class, $type, $subDir);

if (!$class_) {

trigger_error (" [Core] Nie ma takiej klasy: <b>".$class."</b>", E_USER_ERROR);
}

return call_user_func(array( $class_ , "singleton"));
}


function &loadExtinsion( $class, $subDir = ''){
return engine::factory( $class, "extinsion", $subDir);
}
?>[/php:1:f566288767]

Obie metody maja zwracac referencje wiec niewiem gdzie po drodze traci sie instancja obiektu, sziedze nad tym juz dluzza chwile i mam pustke we lbie. Moze cos przeoczylem ?
rzseattle
No dobra , doszedlem do tego ze to
[php:1:074fdb5775]<?php
call_user_func(array( $class_ , "singleton"));
?>[/php:1:074fdb5775]
jest odpowiedzialne za cale zamieszanie poniewaz zwracca caly czas nowe obiekty. Pytanie tylko jak to ominac questionmark.gif przeciez nie moge napisac [php:1:074fdb5775]<?php
return $class_::singleton();
?>[/php:1:074fdb5775]

Ma ktos moze jakis pomysl?


Update: Uff , czasami przegladniecie podpisow na php.net duzo daje. Ktos tam wyjasnil jak ominac nie zwracanie przez call_user_func referencji. Wyglada to mniej wiecej tak [php:1:074fdb5775]<?php
$class =&call_user_func(array( $class_ , "singleton"));
return $class->singleton();
?>[/php:1:074fdb5775]
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.