Versio

Dubbele functies ofzo?

Overzicht Reageren

Danny Appeldoorn

Danny Appeldoorn

19/12/2009 11:43:00
Quote Anchor link
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
 
PHP hulp

PHP hulp

24/05/2012 10:49:09
Gesponsorde koppelingen:
 
Computer

Computer

19/12/2009 12:42:00
Quote Anchor link
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...)
 
Robert Deiman

Robert Deiman

19/12/2009 12:57:00
Quote Anchor link
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.

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
21
<?php
class blaat
{
  public $blaat;
  function
__construct()
  {

    $this->blaat = new blaatje;
  }
  function
voorbeeld()
  {

    echo $this->blaat->test();
  }
}

class blaatje
{
  function
test()
  {

     return 'blaatje_test';
  }
}

?>


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.
 
Pim -

Pim -

19/12/2009 13:10:00
Quote Anchor link
Een veel gebruikt toepassing zijn chained calls. VB:
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
<?php
class Test
{
   private $_a, $_b;

   public function setA($a) {
      $this->_a = $a;
      return $this;
   }


   public function setB($b) {
      $this->_b = $b;
      return $this;
   }
}


$t = new Test;
$t->setA('a')->setB('b');
?>
Gewijzigd op 01/01/1970 01:00:00 door Pim -
 
Computer

Computer

19/12/2009 13:40:00
Quote Anchor link
Een stukje uit die calculatie parser die laatst gepost is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');


Als je dat nou achter elkaar aan zet krijg je wat jij zegt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
 
Robert Deiman

Robert Deiman

19/12/2009 13:46:00
Quote Anchor link
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.
 
Pim -

Pim -

19/12/2009 14:18:00
Quote Anchor link
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.
Gewijzigd op 01/01/1970 01:00:00 door Pim -
 
Danny Appeldoorn

Danny Appeldoorn

19/12/2009 17:01:00
Quote Anchor link
@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)
 
Pim -

Pim -

19/12/2009 18:08:00
Quote Anchor link
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.

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
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');

?>
 
Danny Appeldoorn

Danny Appeldoorn

19/12/2009 18:43:00
Quote Anchor link
Oke dat maakt het een stuk duidelijker, bedankt!
 



Overzicht Reageren

Get Adobe Flash player