Functie altijd beschikbaar
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 :)
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
Als je een functie definieert vóórdat je je framework ingaat, dan is deze functie overal geldig (hij is globaal).
De vraag is dus of je een methode kan maken, die gelijk welk object van gelijk welke class kan aanroepen.
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.
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!
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.
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?
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.
Want je krijg bij beide de zelfde resultset terug.
Gewijzigd op 06/02/2013 15:39:32 door Rick van Riel
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
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?
Even een klein testje, werkt dit wel:
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()
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.