Dubbele functies ofzo?
Goede morgen,
Ik heb regelmatig scripts gezien met bijvoorbeeld $classname->$functieofzo()->nunogeenfunctieofzo(); Heeft iemand enig idee hoe je dit realiseerd of hoe het heet? Ik heb er naar gezocht maar kon niks vinden.
Bvd
Ik heb regelmatig scripts gezien met bijvoorbeeld $classname->$functieofzo()->nunogeenfunctieofzo(); Heeft iemand enig idee hoe je dit realiseerd of hoe het heet? Ik heb er naar gezocht maar kon niks vinden.
Bvd
Gesponsorde koppelingen:
Ja da's raar, ik ben het nog nooit tegengekomen maar misschien dat die
$classname->$functieofzo()
weer een class returnt? (geen idee of dat mogelijk is...)
$classname->$functieofzo()
weer een class returnt? (geen idee of dat mogelijk is...)
Een class die een class returned gebeurt eigenlijk nooit (volgens mij kan het niet eens) maar het is ook niet wenselijk.
Ik denk zelfs dat het niet is wat het lijkt Danny. Of iig niet zoals jij het opvat.
Je kan namelijk een aantal public variables, binnen de gehele eigen class aanroepbaar via $this->naam opstellen.
Als je daaraan een class object toewijst, dus bijv: $this->classname = new classname(voorwaarden); kan je door
$this->classname->functie_binnen_classname een functie binnen de class aanroepen, zonder dat je daarvoor steeds opnieuw een object van die class moet aanmaken. Dit is in sommige gevallen wenselijk, omdat je bijvoorbeeld voort wilt werken op een instantie van die klasse.
Als je nu de functie "voorbeeld" in class blaat aanroept, zal die keurig (omdat je een instantie van de class blaat maakt, die maakt in de construct, die altijd wordt aangeroepen al een instantie van blaatje aan) "blaatje_test" op je scherm tonen.
Ik denk zelfs dat het niet is wat het lijkt Danny. Of iig niet zoals jij het opvat.
Je kan namelijk een aantal public variables, binnen de gehele eigen class aanroepbaar via $this->naam opstellen.
Als je daaraan een class object toewijst, dus bijv: $this->classname = new classname(voorwaarden); kan je door
$this->classname->functie_binnen_classname een functie binnen de class aanroepen, zonder dat je daarvoor steeds opnieuw een object van die class moet aanmaken. Dit is in sommige gevallen wenselijk, omdat je bijvoorbeeld voort wilt werken op een instantie van die klasse.
Code (php)
Als je nu de functie "voorbeeld" in class blaat aanroept, zal die keurig (omdat je een instantie van de class blaat maakt, die maakt in de construct, die altijd wordt aangeroepen al een instantie van blaatje aan) "blaatje_test" op je scherm tonen.
Een veel gebruikt toepassing zijn chained calls. VB:
Code (php)
Gewijzigd op 01/01/1970 01:00:00 door Pim -
Een stukje uit die calculatie parser die laatst gepost is:
Als je dat nou achter elkaar aan zet krijg je wat jij zegt:
Ik weet niet of het dan nog werkt, maar zou kunnen (denk ik)...
Code (php)
1
2
3
4
5
2
3
4
5
$parser ->addOperator('Multiply', '*', 2, 'calcMultiply')
->addOperator('Division', '/', 2, 'calcDivision')
->addOperator('Plus', '+', 1, 'calcPlus')
->addOperator('Minus', '-', 1, 'calcMinus')
->addOperator('Power', '^', 3, 'calcPower');
->addOperator('Division', '/', 2, 'calcDivision')
->addOperator('Plus', '+', 1, 'calcPlus')
->addOperator('Minus', '-', 1, 'calcMinus')
->addOperator('Power', '^', 3, 'calcPower');
Als je dat nou achter elkaar aan zet krijg je wat jij zegt:
Code (php)
1
$parser ->addOperator('Multiply', '*', 2, 'calcMultiply')->addOperator('Division', '/', 2, 'calcDivision')->addOperator('Plus', '+', 1, 'calcPlus')->addOperator('Minus', '-', 1, 'calcMinus')->addOperator('Power', '^', 3, 'calcPower');
Ik weet niet of het dan nog werkt, maar zou kunnen (denk ik)...
Gewijzigd op 01/01/1970 01:00:00 door Computer
Ook dat is inderdaad een mogelijkheid van waar je dit ziet. Maar omdat hij aangeeft dat hij het erg vaak ziet, vond ik het niet helemaal logisch dat het die chained calls zijn. Neemt niet weg dat het wel een mogelijkheid is dat hij dat bedoeld.
Chained calls gebruiken op de manier zoals in de calculator is oké, meerdere keren dezelfde functie en meerdere operators zo in 1 keer toevoegen.
2 calls na elkaar doen vind ik zelf ook overzichtelijker op 2 regels. Je kan als ze toch altijd na elkaar gecalled moeten worden dit ook in de functie afvangen die je het eerste aanroept.
Chained calls gebruiken op de manier zoals in de calculator is oké, meerdere keren dezelfde functie en meerdere operators zo in 1 keer toevoegen.
2 calls na elkaar doen vind ik zelf ook overzichtelijker op 2 regels. Je kan als ze toch altijd na elkaar gecalled moeten worden dit ook in de functie afvangen die je het eerste aanroept.
Ja het is idd maar een voorbeeld (het is btw mijn calculator ;) )
Maar algemener:
$object->funcA($paramsA)->funcB($paramsB);
Eerst wordt $object->funcA($paramsA) uitgevoerd.
Daarna wordt de return value hiervan gebruikt voor de volgende call (method aanroepen) of get (property (object variabele)).
Dus op het resultaat van
$object->funcA($paramsA)
wordt funcB($paramsB) uitgevoerd.
De eerste call of get kan een instance (object van een bepaalde class) van elke class retourneren, zowel die van $object (dus een chained call) of een andere (zie bijvoorbeeld de XML parsers, deze maken er heel veel gebruik van).
Met het retourneren van objects bij calls kan je hele mooie systemen maken, vrijwel alle design patterns (veel gebruikte object relaties om bepaalde problemen op te lossen) werken hiermee.
Maar algemener:
$object->funcA($paramsA)->funcB($paramsB);
Eerst wordt $object->funcA($paramsA) uitgevoerd.
Daarna wordt de return value hiervan gebruikt voor de volgende call (method aanroepen) of get (property (object variabele)).
Dus op het resultaat van
$object->funcA($paramsA)
wordt funcB($paramsB) uitgevoerd.
De eerste call of get kan een instance (object van een bepaalde class) van elke class retourneren, zowel die van $object (dus een chained call) of een andere (zie bijvoorbeeld de XML parsers, deze maken er heel veel gebruik van).
Met het retourneren van objects bij calls kan je hele mooie systemen maken, vrijwel alle design patterns (veel gebruikte object relaties om bepaalde problemen op te lossen) werken hiermee.
Gewijzigd op 01/01/1970 01:00:00 door Pim -
@Robert, Pim en Computer
Bedankt voor de reacties, ik zie nu de mogelijkheden in, ik denk dat het chained calls zijn, aangezien er bij de eerste ook de 2 haakjes van de functie bij staan dus bijv, $blaat->proxyparser()->getpage("blaaterigewaarde"); ofzoiets.
@Pim Kan je mij ietsjes meer uitleg of een voorbeeldje geven over de params van de eerste die worden doorgegeven aan de 2e?
Bvd (alweer)
Bedankt voor de reacties, ik zie nu de mogelijkheden in, ik denk dat het chained calls zijn, aangezien er bij de eerste ook de 2 haakjes van de functie bij staan dus bijv, $blaat->proxyparser()->getpage("blaaterigewaarde"); ofzoiets.
@Pim Kan je mij ietsjes meer uitleg of een voorbeeldje geven over de params van de eerste die worden doorgegeven aan de 2e?
Bvd (alweer)
Ok, de extra uitleg, met een voorbeeldje. Nu retourneert hij een ander object, een voorbeeld van chained calls staat in mn vorige post.
Stel, je hebt 2 classes, A en B.
A is bijvoorbeeld een DB class (PDO/MySQLi) en B is de wrapper die ervoor zorgt dat je makkelijker queries uit kan voeren.
Stel, je hebt 2 classes, A en B.
A is bijvoorbeeld een DB class (PDO/MySQLi) en B is de wrapper die ervoor zorgt dat je makkelijker queries uit kan voeren.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
class A extends PDO {}
class B {
private $_a;
// Stel de property a in
// De underscore (_) is een naamgevingsafspraak voor private properties
// Return this voor chained calls
public function setA($a) {
$this->_a = $a;
return $this;
}
// Lege functie
public function void() {
return true;
}
// Geef a
public function getA() {
return $this->_a;
}
}
// Maak a, maak de PDO aan
$a = new a('mysql;host=localhost;dbname=DBNAAM', 'username', 'password');
$b = new b;
// Stel a in, en nog even een voorbeeldje van een chained call
$b->setA($a)->void();
// Verkrijg a en voer meteen een query op uit
$b->getA()->query('SELECT * FROM table');
?>
class A extends PDO {}
class B {
private $_a;
// Stel de property a in
// De underscore (_) is een naamgevingsafspraak voor private properties
// Return this voor chained calls
public function setA($a) {
$this->_a = $a;
return $this;
}
// Lege functie
public function void() {
return true;
}
// Geef a
public function getA() {
return $this->_a;
}
}
// Maak a, maak de PDO aan
$a = new a('mysql;host=localhost;dbname=DBNAAM', 'username', 'password');
$b = new b;
// Stel a in, en nog even een voorbeeldje van een chained call
$b->setA($a)->void();
// Verkrijg a en voer meteen een query op uit
$b->getA()->query('SELECT * FROM table');
?>
Oke dat maakt het een stuk duidelijker, bedankt!



