Oznámení
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…