tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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

před 9 lety

mcmatak
Člen | 492

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)

před 9 lety

paranoiq
Člen | 388

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()

před 9 lety

mcmatak
Člen | 492

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?

před 9 lety

mcmatak
Člen | 492

asi sem byl moc rychlej, uz to zase nefunguje sakra

před 9 lety

mcmatak
Člen | 492

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

před 9 lety

mcmatak
Člen | 492
<?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)

před 9 lety

paranoiq
Člen | 388

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)

před 9 lety

mcmatak
Člen | 492

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…