Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před 2 lety

Petr Daňa
Člen
Registrovaný: 14. 4. 2008
Příspěvky: 97

dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

Pročpak to? A mění se něco z hlediska používání nebo chování?

 

#2 před 2 lety

paranoiq
Moderator
Registrovaný: 14. 11. 2006
Příspěvky: 381

Re: dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

nic to nemění. DibiRow se stále chová jako pole

ArrayObject je zbytečně komplikovaný a jsou tam věci, které nejsou pro DR třeba. KISS

 

#3 před 2 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5833

Re: dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

Jak píše Paranoiq.

 

#4 před 2 lety

Petr Daňa
Člen
Registrovaný: 14. 4. 2008
Příspěvky: 97

Re: dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

Hm, tak nevím, jestli to je už v téhle verzi, ale dneska jsem stáhnul verzi z 2010–04–26 a přestalo mi fungovat tohle:

<?php
public function getOperators($country_code = NULL)
{
        $select = dibi::select('*')->from('sd_operators');
        if (!empty($country_code))
        {
                $select->where("country_code = %s", $country_code);
        }
        return $select->fetchAssoc('operator_id');
}
...
$operators = $services->getOperators($this->template->service['country']);
...
foreach ($operators as &$operator)
{
        $operator['revenues'] = array();
        foreach ($this->template->revenue_groups as $revenue_group_id => $tmp)
        {
!!!             $operator['revenues'][$revenue_group_id] = NULL;
        }
}
unset($operator);

foreach ($revenues as $revenue)
{
!!!     $operators[$revenue['operator_id']]['revenues'][$revenue['revenue_group_id']] = $revenue['value'];
}
?>

Na řádcích označených !!! – tj. změna objektu DibiRow mi to vyhazuje:

PHP Notice: Indirect modification of overloaded element of DibiRow has no effect in …

a nic nepřiřadí. Ve verzi z 2010–04–06 to fungovalo.

Takže co je jinak? Co jsem koukal do zdrojáků DibiRow, tak by se to opravdu mělo chovat jako pole…

EDIT:

Ještě jsem to trochu prošel, tak ten řádek

<?php
$operator['revenues'] = array();
?>

projde, tj. v objektu DibiRow vytvoří novou položku „revenues“, která je pole, ale když chci přidat do tohoto pole index, tak to už nedá.

EDIT 2:

Tak to asi souvisí s tímhle BUGem v PHP?

http://bugs.php.net/bug.php?…
( http://bugs.php.net/bug.php?… )
( http://bugs.php.net/bug.php?… )

EDIT 3 (snad naposled) – ŘEŠENÍ:

Tak když k tomu ‚revenues‘ nepřistupuju jako prvku v poli, ale jako členské proměnné, tak to funguje, tj.:

<?php
$operator->revenues = array();
...
$operator->revenues[$revenue_group_id] = NULL;
...
$operators[$revenue['operator_id']]->revenues[$revenue['revenue_group_id']] = $revenue['value'];
?>

Editoval Petr Daňa (30. 4. 2010 14:28)

 

#5 před 2 lety

bene
Člen
Registrovaný: 24. 3. 2010
Příspěvky: 56

Re: dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

Zdravím,
tohle je docela krutý zásah. Mám nad dibi napsaný orm, jenže nepoužívám ‚DibiRow‘, ale vlastní třídu (důvod je určitě jasný). V revizi 0b95624 mi dokonce fungoval ‚fetchAssoc‘, neboť byl přepsán (nebyla použita konstrukce ‚(array) $row‘, achjo php). Teď už ale nebude fungovat ani ‚fetchPairs‘, neboť se používá funkce ‚property_exists‘, která nebere vpotaz magickou funkci ‚__get‘.
Jestliže DibiRow umí pracovat jako ‚ArrayAccess‘, bylo by skvělé používat tyto přístupy (všichni by s tím počítali). Nebo ještě lépe vytvořit rozhraní ‚IDibiRow‘, které by třída měla definovat a chování upravit podle ní (např funkci ‚propertyExists‘). Je to nejelegantnější a troufám si tvrdit nejsprávnější řešení.

Prosím o zvážení.

Děkuji

 

#6 před 2 lety

paranoiq
Moderator
Registrovaný: 14. 11. 2006
Příspěvky: 381

Re: dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

ahoj, DibiRow je hloupý Data Transfer Object. dělat z něj děděním cokoliv jiného je chybou v návrhu. tvá základní modelová/ORM třída by nikdy neměla objekt řádku rozšiřovat – měla by jej spíše obsahovat. pak bys neměl důvod implementovat vlastní třídu NěcoRow

nevyřešila by tvůj aktuální problém prostá náhrada property_exists() za isset()?

 

#7 před 2 lety

Jan Tvrdík
Nette guru
Registrovaný: 13. 4. 2008
Příspěvky: 1255

Re: dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

Potvrzuji stejný problém, jako má bene, náhrada property_exists za isset to řeší.

 

#8 před 2 lety

bene
Člen
Registrovaný: 24. 3. 2010
Příspěvky: 56

Re: dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

paranoiq napsal(a):

ahoj, DibiRow je hloupý Data Transfer Object. dělat z něj děděním cokoliv jiného je chybou v návrhu. tvá základní modelová/ORM třída by nikdy neměla objekt řádku rozšiřovat – měla by jej spíše obsahovat. pak bys neměl důvod implementovat vlastní třídu NěcoRow

nevyřešila by tvůj aktuální problém prostá náhrada property_exists() za isset()?

Ahoj,
to je úhel pohledu. Proč bych měl v základní třídě pro row uchovavat DibiRow? To tam můžu rovnou uchovávat data v primitivním poli (což také dělám). Tím že nahradím DibiRow svým objektem, mohu pořád využívat kouzla dibi, jako fetchAssoc. Ale jak to vidím, nic jiného mi stejně nezbyde.
Přesto stále tvrdím, ze implementace rozhraní je nejlepší řešení. Třeba Nette na tom stojí celé.

 

#9 před rokem

Milanov
Člen
Registrovaný: 10. 7. 2007
Příspěvky: 29

Re: dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

Petr Daňa napsal(a):

Na řádcích označených !!! – tj. změna objektu DibiRow mi to vyhazuje:

PHP Notice: Indirect modification of overloaded element of DibiRow has no effect in …

a nic nepřiřadí. Ve verzi z 2010–04–06 to fungovalo.

V poslední verzi (1.5rc) je stále stejný „problém“. Jedná se vůbec o problém, nebo o vlastnost a nic s tím nelze udělat?

 

#10 před 4 měsíci

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5833

Re: dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

Voláním setRowClass(FALSE) si můžete nechat vracet pole.

 

#11 před 4 měsíci

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5833

Re: dev 2010–04–22 – DibiRow is not longer ArrayObject descendant

Milanov napsal(a):

Petr Daňa napsal(a):

PHP Notice: Indirect modification of overloaded element of DibiRow has no effect in …

V poslední verzi (1.5rc) je stále stejný „problém“. Jedná se vůbec o problém, nebo o vlastnost a nic s tím nelze udělat?

Jedná se o vlastnost PHP, se kterou nelze nic udělat.

 

Zápatí