Functie altijd beschikbaar
Hallo allemaal,
Het viel me in Zend Framework op dat de functie toArray() altijd aangeroepen kan worden.
Ik vroeg me af hoe dit in kan maar kwam eigenlijk niks tegen.
Er zijn hier volgens mij wel een aantal mensen die met Zend Framework werken die misschien uit kunnen leggen hoe dit kan.
Alvast bedankt.
Het viel me in Zend Framework op dat de functie toArray() altijd aangeroepen kan worden.
Ik vroeg me af hoe dit in kan maar kwam eigenlijk niks tegen.
Er zijn hier volgens mij wel een aantal mensen die met Zend Framework werken die misschien uit kunnen leggen hoe dit kan.
Alvast bedankt.
Kun je een voorbeeldje laten zien? Dan kan ik eens op onderzoek gaan :)
Hier haal ik in mijn controller wat data op via mijn model:
Deze kan dan via de functie toArray() erachter te zetten van een standaard Zend object omgezet worden naar een array.
Code (php)
1
2
3
4
2
3
4
<?php
$model = new Frontend_Model_Cursusitems();
$result = $model->getFirstItem($id)->toArray();
?>
$model = new Frontend_Model_Cursusitems();
$result = $model->getFirstItem($id)->toArray();
?>
Deze kan dan via de functie toArray() erachter te zetten van een standaard Zend object omgezet worden naar een array.
Gewijzigd op 05/02/2013 16:52:12 door Rick van Riel
Rick,
Als je een functie definieert vóórdat je je framework ingaat, dan is deze functie overal geldig (hij is globaal).
Als je een functie definieert vóórdat je je framework ingaat, dan is deze functie overal geldig (hij is globaal).
Deze functie is toch gewoon aangemaakt in Zend\Db\ResultSet\AbstractResultSet? De code: https://github.com/zendframework/zf2/blob/master/library/Zend/Db/ResultSet/AbstractResultSet.php#L248-271
als ik het goed begrijp ...
De vraag is dus of je een methode kan maken, die gelijk welk object van gelijk welke class kan aanroepen.
De vraag is dus of je een methode kan maken, die gelijk welk object van gelijk welke class kan aanroepen.
Ja dat snap ik maar hoe word de data die voor ->toArray() meegestuurd zodat deze verwerkt word?
Normaal stuur je de parameters namelijk mee doormiddel van ->toArray($data) maar hier word de data voor de toArray gebruikt.
Toevoeging op 05/02/2013 17:03:54:
Ja Kris dat plus het gene dat ik in mijn vorige post heb aangegeven.
Normaal stuur je de parameters namelijk mee doormiddel van ->toArray($data) maar hier word de data voor de toArray gebruikt.
Toevoeging op 05/02/2013 17:03:54:
Ja Kris dat plus het gene dat ik in mijn vorige post heb aangegeven.
Rick, zie de code waar ik naar linkte:
Ze loopen dus over $this. Dat kan omdat $this Iterator implement, google daar maar eens op voor meer informatie over Iterators in PHP: Een van de geweldige PHP features!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
public function toArray()
{
$return = array();
foreach ($this as $row) {
if (is_array($row)) {
$return[] = $row;
} elseif (method_exists($row, 'toArray')) {
$return[] = $row->toArray();
} elseif ($row instanceof ArrayObject) {
$return[] = $row->getArrayCopy();
} else {
throw new Exception\RuntimeException(
'Rows as part of this DataSource, with type ' . gettype($row) . ' cannot be cast to an array'
);
}
}
return $return;
}
?>
public function toArray()
{
$return = array();
foreach ($this as $row) {
if (is_array($row)) {
$return[] = $row;
} elseif (method_exists($row, 'toArray')) {
$return[] = $row->toArray();
} elseif ($row instanceof ArrayObject) {
$return[] = $row->getArrayCopy();
} else {
throw new Exception\RuntimeException(
'Rows as part of this DataSource, with type ' . gettype($row) . ' cannot be cast to an array'
);
}
}
return $return;
}
?>
Ze loopen dus over $this. Dat kan omdat $this Iterator implement, google daar maar eens op voor meer informatie over Iterators in PHP: Een van de geweldige PHP features!
Wouter,
Ik ben in de dingen rond gaan kijken die je mij hebt gegeven maar kom er nog niet uit hoe Zend ervoor zorgt dat de functie ->toArray() op elk object beschikbaar is.
Als ik namelijk fluent wil werken zal ik moeten gebruik om de class mee terug te sturen. Alleen als ik iets uit de database ophaal dan return ik een object en dan kan ik dus niet meer return $this; gebruik om de class me terug te sturen.
Hoe kan ik er dan dus toch nog voor zorgen dat ik ->toArray() kan gebruiken zonder de class zelf mee terug te sturen maar het object dat ik om wil zetten in een array.
Ik ben in de dingen rond gaan kijken die je mij hebt gegeven maar kom er nog niet uit hoe Zend ervoor zorgt dat de functie ->toArray() op elk object beschikbaar is.
Als ik namelijk fluent wil werken zal ik moeten gebruik om de class mee terug te sturen. Alleen als ik iets uit de database ophaal dan return ik een object en dan kan ik dus niet meer return $this; gebruik om de class me terug te sturen.
Hoe kan ik er dan dus toch nog voor zorgen dat ik ->toArray() kan gebruiken zonder de class zelf mee terug te sturen maar het object dat ik om wil zetten in een array.
Wel, om te beginnen, return $this geeft het object terug; niet de class.
Maar ik zie niet goed in in welke situatie je dit wil.
->toArray() geeft een array terug.
bv. $items = $object->toArray();
Wat wil je daar verder nog aan (chain)linken?
Maar ik zie niet goed in in welke situatie je dit wil.
->toArray() geeft een array terug.
bv. $items = $object->toArray();
Wat wil je daar verder nog aan (chain)linken?
Zoals ik hierboven ook aal aangaf
Daar krijg ik een data uit mijn database in de vorm van een object.
Deze data wil ik kan om kunnen zetten naar een array doormiddel van er ->toArray(); achter te zetten.
Code (php)
1
2
3
4
2
3
4
<?php
$model = new Frontend_Model_Cursusitems();
$result = $model->getFirstItem($id)->toArray();
?>
$model = new Frontend_Model_Cursusitems();
$result = $model->getFirstItem($id)->toArray();
?>
Daar krijg ik een data uit mijn database in de vorm van een object.
Deze data wil ik kan om kunnen zetten naar een array doormiddel van er ->toArray(); achter te zetten.
Rick, als je iets van de database ophaalt gebruik je return $result;. Die $result is weer een ResultSet object, daarop kun je dus gewoon weer direct een method aanroepen. Dus:
Maar waarom werkt de bovenste methode dan niet en de onderste wel? (Bij mij)
Want je krijg bij beide de zelfde resultset terug.
Want je krijg bij beide de zelfde resultset terug.
Gewijzigd op 06/02/2013 15:39:32 door Rick van Riel
Dat lijkt op 1 van de nieuwe features van php 5.4
http://www.php.net/manual/en/migration54.new-features.php
- Function array dereferencing has been added, e.g. foo()[0].
- Class member access on instantiation has been added, e.g. (new Foo)->bar().
Die laten dus gemakkelijker dan vroeger toe dat je verder kan werken na het aanroepen van een methode; zonder dit eerst in een variabele te moeten stockeren.
Dus meer richting javascript, die daar nooit een probleem van gemaakt heeft.
http://www.php.net/manual/en/migration54.new-features.php
- Function array dereferencing has been added, e.g. foo()[0].
- Class member access on instantiation has been added, e.g. (new Foo)->bar().
Die laten dus gemakkelijker dan vroeger toe dat je verder kan werken na het aanroepen van een methode; zonder dit eerst in een variabele te moeten stockeren.
Dus meer richting javascript, die daar nooit een probleem van gemaakt heeft.
Gewijzigd op 06/02/2013 15:55:00 door Kris Peeters
Kris, nee dat heeft hier niks mee te maken. De eerste feature die je aangeeft is dat je dit kunt doen:
En de tweede staat dit toe:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$foo = $model->getFirstItem($id)[0];
// waarbij je in <PHP5.4 dit gebruikte:
$foo = $model->getFirstItem($id);
$foo = $foo[0];
?>
$foo = $model->getFirstItem($id)[0];
// waarbij je in <PHP5.4 dit gebruikte:
$foo = $model->getFirstItem($id);
$foo = $foo[0];
?>
En de tweede staat dit toe:
Maar waarom werkt methode 1 dan niet bij mij en methode 2 wel?
Ah, ik had niet door gekregen dat het niet bij je werkte.
Even een klein testje, werkt dit wel:
Even een klein testje, werkt dit wel:
Nee dit werkt niet bij mij. Ik krijg de volgende error:
Fatal error: Class 'Foo' not found in C:\wamp\www\eigenwerk\youtube\index.php on line 17
Fatal error: Class 'Foo' not found in C:\wamp\www\eigenwerk\youtube\index.php on line 17
Ah, sorry. Regel 13 moet return new A() zijn ipv return new Foo()
Wouter dit werkt gewoon. Maar in de plaats van dat ik nu een functie aanroep roep je een heel object aan.
Dus waar nu staat
staat er
en $result is dan gevuld met de data die ik uit de database haal.
Toevoeging op 07/02/2013 10:40:36:
Het is me nu gelukt. Als mensen willen weten hoe het gedaan word dan kan ik het hier wel even posten.
Dus waar nu staat
staat er
en $result is dan gevuld met de data die ik uit de database haal.
Toevoeging op 07/02/2013 10:40:36:
Het is me nu gelukt. Als mensen willen weten hoe het gedaan word dan kan ik het hier wel even posten.




