Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před rokem

mcmatak
dibi guru
Registrovaný: 17. 7. 2009
Příspěvky: 364

Klon dibifluentu mi změní původní dibifluent při převodu na string?

mam potomka DibiFluent

echo '<div style="float:left;width:500px">';
dump($this);
echo '</div>';

$c = clone $this;

$c->_export();

//              $q = (string)$c;

echo '<div style="float:left;width:500px">';
dump($this);
echo '</div>';

jak je možné že mi klon změní původní dibifluent?

tak už vím kde je problém, nevím jeslti vina php, nebo dibi, ale cursor odkazuje referencí na clauses, jenomže po klonování tato reference nezmizí, a při úpravě nového naklonovaného objektu se díky cursoru upravuje ten původní

řešení:

přidat do dibifluent

private function __clone()
{
$this->cursor = & $this->clauses[‚SELECT‘];
 }

Editoval mcmatak (18. 8. 2010 17:29)

 

#2 před rokem

paranoiq
dibi guru
Registrovaný: 14. 11. 2006
Příspěvky: 357

Re: Klon dibifluentu mi změní původní dibifluent při převodu na string?

nejspíš za to může mělká kopie. obsahuje tvůj potomek nějaké jiné objekty nebo reference? ty se při klonování nekopírují

použij __clone()

 

#3 před rokem

mcmatak
dibi guru
Registrovaný: 17. 7. 2009
Příspěvky: 364

Re: Klon dibifluentu mi změní původní dibifluent při převodu na string?

samotnou referenci obsahuje dibifluent, snad z nastíněného řešení které jsem doplnil do příspěvku, pochopíš v čem je problém, třeba to jde řešit jinak než zásahem do dibifluent?

 

#4 před rokem

mcmatak
dibi guru
Registrovaný: 17. 7. 2009
Příspěvky: 364

Re: Klon dibifluentu mi změní původní dibifluent při převodu na string?

asi sem byl moc rychlej, uz to zase nefunguje sakra

 

#5 před rokem

mcmatak
dibi guru
Registrovaný: 17. 7. 2009
Příspěvky: 364

Re: Klon dibifluentu mi změní původní dibifluent při převodu na string?

http://php.vrana.cz/…-objektu.php

takže jestli správně rozumím musím si kopie vytvářet ručně, a musím tedy opět zasáhnout do dibifluent protože jsou ty reference private

 

#6 před rokem

mcmatak
dibi guru
Registrovaný: 17. 7. 2009
Příspěvky: 364

Re: Klon dibifluentu mi změní původní dibifluent při převodu na string?

<?php

tak nikde jsem zadne reference nenasel

prepsal jsem si metodu __call zhruba takhle

        public function __call($clause, $args)
        {
                switch($clause) {
                        // callback na # je docela nebezpecny, napr. regulary mohou obsahovat # atd. tedy pokud nechci aby se prekladal sign # tak pouziju rselect
                        case 'rselect':
                                        if ($args[0] === false) {
                                                $this->selects = array();
                                        }
                                        return parent::__call('select', $args);

?>

a při volání parent::__call dochází k tomu že zapisuje k původnímu objektu a ne k tomu clonovanému**

Editoval mcmatak (18. 8. 2010 17:48)

 

#7 před rokem

paranoiq
dibi guru
Registrovaný: 14. 11. 2006
Příspěvky: 357

Re: Klon dibifluentu mi změní původní dibifluent při převodu na string?

nevidím jak z toho ven bez úpravy DF. tak jak je to napsáno by sis nepomohl ani kdyby kursor byl protected :[

chtělo by to, aby kursor byl index do pole clauses a nikoliv reference na jeho prvek
UPDATE: … což pochopitelně nepůjde, clauses je asi strom, že? :[

(snad jsem to pochopil správně)

Editoval paranoiq (18. 8. 2010 20:12)

 

#8 před rokem

mcmatak
dibi guru
Registrovaný: 17. 7. 2009
Příspěvky: 364

Re: Klon dibifluentu mi změní původní dibifluent při převodu na string?

takze jsem aktualizoval na dibi 1.3 kde jak se zda je to vyreseno, puvodne jsem mel verzi 1.1

v kazdem pripade dibi 1.3 je rozdilna v mnoha vecech, uz jen treba absence inTransaction, coz se musi patchnout, ppredstava ze predavam vsem funkcim jeslti jsem zrovna v transakci by mi dalo asi tak tyden prepsat celou aplikaci, a app by se o dost zeslozitila,

pokud odpovedi maji byt savepointy nedokazu si predstavit napr. orm, ktere v cyklu uklada objekty a tento cyklus je v transakci vymyslet unikatni savepoint pro kazdy objekt … no nevim … vykon app rapidne dolu, prehlednost rapidne k zemi, slozitost rapidne nahoru, no ale jina pohadka, to je postesk snad jen…

 

Zápatí