Functie altijd beschikbaar

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rick van Riel

Rick van Riel

05/02/2013 16:35:57
Quote Anchor link
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.
 
PHP hulp

PHP hulp

25/04/2024 18:16:09
 
Wouter J

Wouter J

05/02/2013 16:38:29
Quote Anchor link
Kun je een voorbeeldje laten zien? Dan kan ik eens op onderzoek gaan :)
 
Rick van Riel

Rick van Riel

05/02/2013 16:49:07
Quote Anchor link
Hier haal ik in mijn controller wat data op via mijn model:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$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
 
Ozzie PHP

Ozzie PHP

05/02/2013 16:54:43
Quote Anchor link
Rick,

Als je een functie definieert vóórdat je je framework ingaat, dan is deze functie overal geldig (hij is globaal).

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

function doeIets() {

}


$application = new Application();
$application->test();

// in de functie test kun je nu de functie doeIets() gebruiken

class Application {

  public function test() {
    doeIets();
  }

}


?>
 
Wouter J

Wouter J

05/02/2013 16:58:10
Quote Anchor link
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
 
Kris Peeters

Kris Peeters

05/02/2013 17:00:49
Quote Anchor link
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.
 
Rick van Riel

Rick van Riel

05/02/2013 17:00:53
Quote Anchor link
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.
 
Wouter J

Wouter J

05/02/2013 17:06:30
Quote Anchor link
Rick, zie de code waar ik naar linkte:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>


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!
 
Rick van Riel

Rick van Riel

06/02/2013 15:16:21
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php return $this; ?>
moeten gebruik om de class mee terug te sturen. Alleen als ik iets uit de database ophaal dan return ik een object
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php return $result; ?>
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.
 
Kris Peeters

Kris Peeters

06/02/2013 15:31:28
Quote Anchor link
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?
 
Rick van Riel

Rick van Riel

06/02/2013 15:34:42
Quote Anchor link
Zoals ik hierboven ook aal aangaf
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$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.
 
Wouter J

Wouter J

06/02/2013 15:35:05
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$model
= new Frontend_Model_Cursusitems();
$result = $model->getFirstItem($id)->toArray();

// is hetzelfde als
$result = $model->getFirstItem($id); // returns a ResultSet
$resultArray = $result->toArray();
?>
 
Rick van Riel

Rick van Riel

06/02/2013 15:39:09
Quote Anchor link
Maar waarom werkt de bovenste methode dan niet en de onderste wel? (Bij mij)
Want je krijg bij beide de zelfde resultset terug.
Gewijzigd op 06/02/2013 15:39:32 door Rick van Riel
 
Kris Peeters

Kris Peeters

06/02/2013 15:50:08
Quote Anchor link
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.
Gewijzigd op 06/02/2013 15:55:00 door Kris Peeters
 
Wouter J

Wouter J

06/02/2013 15:57:23
Quote Anchor link
Kris, nee dat heeft hier niks mee te maken. De eerste feature die je aangeeft is dat je dit kunt doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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];
?>

En de tweede staat dit toe:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$foo
= (new Foo())->getFirstItem($id);

// waarbij je in <PHP5.4 dit gebruikte:
$foo = new Foo();
$foo->getFirstItem($id);
 
Rick van Riel

Rick van Riel

06/02/2013 16:35:24
Quote Anchor link
Maar waarom werkt methode 1 dan niet bij mij en methode 2 wel?
 
Wouter J

Wouter J

06/02/2013 16:48:57
Quote Anchor link
Ah, ik had niet door gekregen dat het niet bij je werkte.

Even een klein testje, werkt dit wel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class A
{
    public function foo()
    {

        echo 'bar';
    }
}

class B
{
    public function bar()
    {

        return new Foo();
    }
}


$b = new B();

$b->bar()->foo();
?>
 
Rick van Riel

Rick van Riel

06/02/2013 16:58:53
Quote Anchor link
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
 
Wouter J

Wouter J

06/02/2013 17:01:06
Quote Anchor link
Ah, sorry. Regel 13 moet return new A() zijn ipv return new Foo()
 
Rick van Riel

Rick van Riel

06/02/2013 21:44:35
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php return new Foo(); ?>

staat er
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php return $result; ?>

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.