[PHP] Aanroepen van een functie met optionele parameters.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 26-04-2024

Jeffroiscool

Proud DD Member! :D

Topicstarter
Hallo allemaal, ben weer eens bezig met m'n project en ik loop weer eens tegen een dilemma aan.

Ik heb een functie om iets aan te maken, hier kan je optionele parameters meegeven.

PHP:
1
2
3
function doeiets($verplicht, $optioneel = null, $optioneel2 = null, $optioneel3 = null, $optioneel4 = null){
    //doeiets
}


Nu heb ik dus het probleem als ik die functie wil aanroepen dat hij logisch de variablen gebruikt in die volgorde.

Maar als ik de functie nu wil aanroepen met bijvoorbeeld
PHP:
1
doeiets($verplicht, $optioneel2, $optioneel4);

Hoe zorg ik er dan voor dat de functie ze wel gebruikt zoals ik dat wil?

[ Voor 4% gewijzigd door Jeffroiscool op 18-03-2011 12:14 ]

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


Acties:
  • 0 Henk 'm!

  • dvdheiden
  • Registratie: Maart 2006
  • Laatst online: 19:03
Kan je niet gewoon een array met argumenten meegeven?

PHP:
1
2
3
4
5
6
7
8
9
10
$args = array(
'verplicht' => 1,
'optioneel' => null
..
);
doeIets($args);

function doIets($args) {

}

Dan kan je in je functie kijken of het argument in de array zit.

[ Voor 14% gewijzigd door dvdheiden op 18-03-2011 12:21 ]


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 15-09 09:10
Voor zover ik weet zijn zogenaamde named arguments niet mogelijk bij PHP. Wel worden er workarounds gegeven waarin je eigenlijk twee opties hebt:
  • Eén optionele parameter gebruiken welke een array() is, waar je door middel van key=>value waardes de juiste parameters doorgeeft. Dan kun je met een switch (of if) de juiste variabelen selecteren en code uitvoeren.
  • De overige optionele variabele leeg (of null) meegeven.
IMHO ligt het sterk aan het doel van de code welke variant je gebruikt.

Acties:
  • 0 Henk 'm!

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 26-04-2024

Jeffroiscool

Proud DD Member! :D

Topicstarter
Aangezien ik gebruik maak van array's (als die optionele parameters) zal ik dus een array in een array moeten plaatsen?

Doel van m'n code is eigenlijk om een stukje XML te genereren op basis van de optionele array. Nu werkt dit dus prima als ik maar 1 optionele array heb maar met meerdere word het al een stukje lastiger.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        if(!empty($pref_params)){
            $prefs = $xml->createElement('prefs');
            $add->appendChild($prefs);
            foreach($pref_params as $key => $value){
                $xmlelement = $xml->createElement($key, $value);
                $prefs->appendChild($xmlelement);
            }
        }
        if(!empty($limit_params)){
            $limits = $xml->createElement('limits');
            $add->appendChild($limits);
            foreach($limit_params as $key => $value){
                $xmlelement = $xml->createElement($key, $value);
                $limits->appendChild($xmlelement);
            }
        }


Daar gebruik het eigenlijk voor ;)

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 18-09 16:32
Ik zou dan toch voor:
PHP:
1
2
3
<?php 
doeiets($verplicht, $optioneel2, null, $optioneel4); 
?>


Gaan denk ik ... Aangezien ze toch als null gedefinieerd worden als ze niet meegegeven worden lijkt me dit de overzichtelijkste oplossing, ipv met arrays klooien..

Acties:
  • 0 Henk 'm!

Verwijderd

De optionele zaken moeten ingevuld staan totaan de laatst gebruikte.
Als je alleen 3 wilt gebruiken moet je 1 & 2 ook doorgeven. 4 kun je dan wel negeren.

doeiets("verplichte waarde, null, null, "optionele waarde 3");

Acties:
  • 0 Henk 'm!

  • dvdheiden
  • Registratie: Maart 2006
  • Laatst online: 19:03
Zo te zien verschilt alleen het element, dus kan je die toch gemakkelijk a.d.h.v. je parameter maken, de rest veranderd verder niet, zoiets:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$elm = null;
$params = array();
if ($pref_param) {
    $elm = $xml->createElement('prefs');
    $params = $pref_param;
}
..
$add->appendChild($elm); 
foreach($params as $key => $value){ 
    $xmlelement = $xml->createElement($key, $value); 
    $elm->appendChild($xmlelement); 
}


Welke methode je daarvoor gebruikt om je functie aan te roepen maakt verder niet uit.

Acties:
  • 0 Henk 'm!

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 26-04-2024

Jeffroiscool

Proud DD Member! :D

Topicstarter
HackZois schreef op vrijdag 18 maart 2011 @ 12:32:
Zo te zien verschilt alleen het element, dus kan je die toch gemakkelijk a.d.h.v. je parameter maken, de rest veranderd verder niet, zoiets:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$elm = null;
$params = array();
if ($pref_param) {
    $elm = $xml->createElement('prefs');
    $params = $pref_param;
}
..
$add->appendChild($elm); 
foreach($params as $key => $value){ 
    $xmlelement = $xml->createElement($key, $value); 
    $elm->appendChild($xmlelement); 
}


Welke methode je daarvoor gebruikt om je functie aan te roepen maakt verder niet uit.
Het gaat om meerdere params ;)

Misschien dat dit het een stukje verduidelijkt.

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
38
39
40
41
42
43
44
45
    function domainCreatePacket($gen_params, $host_params, $pref_params = null, $limit_params = null){
        // Create new XML document.
        $xml = new DomDocument('1.0', 'UTF-8');
        $xml->formatOutput = true;
        
        // Create packet
        $packet = $xml->createElement('packet');
        $packet->setAttribute('version', '1.4.2.0');
        $xml->appendChild($packet);
        $client = $xml->createElement('domain');
        $packet->appendChild($client);
        $add = $xml->createElement('add');
        $client->appendChild($add);
        $gen_setup = $xml->createElement('gen_setup');
        $add->appendChild($gen_setup);
        foreach($gen_params as $key => $value){
            $xmlelement = $xml->createElement($key, $value);
            $gen_setup->appendChild($xmlelement);
        }
        $hosting = $xml->createElement('hosting');
        $add->appendChild($hosting);
        $htype = $xml->createElement($gen_params['htype']);
        $hosting->appendChild($htype);
        foreach($host_params as $key => $value){
            $xmlelement = $xml->createElement($key, $value);
            $htype->appendChild($xmlelement);
        }
        if(!empty($pref_params)){
            $prefs = $xml->createElement('prefs');
            $add->appendChild($prefs);
            foreach($pref_params as $key => $value){
                $xmlelement = $xml->createElement($key, $value);
                $prefs->appendChild($xmlelement);
            }
        }
        if(!empty($limit_params)){
            $limits = $xml->createElement('limits');
            $add->appendChild($limits);
            foreach($limit_params as $key => $value){
                $xmlelement = $xml->createElement($key, $value);
                $limits->appendChild($xmlelement);
            }
        }
        return $xml->saveXML();
    }


Ik denk dat ik dan inderdaad ga voor de functie aanroepen met null als waarde ;)

PHP:
1
2
3
4
5
        $gen = array('name' => 'koektrommel2.nl', 'client_id' => $client->id, 'htype' => 'std_fwd', 'status' => '0');
        $hosting = array('dest_url' => 'http://koekje.nl', 'ip_address' => '192.168.1.60');
        if($pleskapi->createDomain($host, $gen, $hosting)){
            echo "Domein is aangemaakt.";
        }

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 15-09 09:10
Kijk ook even of je niet het een en ander in private functies kunt stoppen. Anders heb je kans dat je dadelijk een ontzettend grote functie krijgt, welke onleesbaar wordt.

Acties:
  • 0 Henk 'm!

  • kaesve
  • Registratie: Maart 2009
  • Laatst online: 16-05 03:04
hm. doe je die 8 regels voor elke optionele parameter? want het voelt erg copy-paste :D
misschien, als je het in een grote optionele 2d array kan zetten, kan je het zo doen

PHP:
1
2
3
4
5
6
7
8
9
10
11
    function doe_iets($verplicht, $optioneel) {
        ... //doe iets met verplicht
        foreach($optioneel as $opt_name => $opt_values) {
            $node = $xml->createElement($opt_name);
            $add->appendChild($node);
            foreach ($opt_values as $key => $value) {
                $xmlelement = $xml->createElement($key, $value);
                $node->appendChild($xmlelement);
            }
        }
    }


edit::naar aanleiding van de code hierboven even snel:

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
    function domainCreatePacket($gen_params, $host_params, $opt_params = null){
        // Create new XML document.
        // ..
        
        // Create packet
        // ..

        $hosting = $xml->createElement('hosting');
        $add->appendChild($hosting);
        $htype = $xml->createElement($gen_params['htype']);
        $hosting->appendChild($htype);
        foreach($host_params as $key => $value){
            $xmlelement = $xml->createElement($key, $value);
            $htype->appendChild($xmlelement);
        }

        // Add general setup and optional parameters
        $opt_params['gen_setup'] = $gen_setup;
        foreach($opt_params as $opt_name => $opt_values) {
            $node = $xml->createElement($opt_name);
            $add->appendChild($node);
            foreach ($opt_values as $key => $value) {
                $xmlelement = $xml->createElement($key, $value);
                $node->appendChild($xmlelement);
            }
        }

        return $xml->saveXML();
    }

[ Voor 46% gewijzigd door kaesve op 18-03-2011 13:04 ]


Acties:
  • 0 Henk 'm!

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 26-04-2024

Jeffroiscool

Proud DD Member! :D

Topicstarter
alex3305 schreef op vrijdag 18 maart 2011 @ 12:47:
Kijk ook even of je niet het een en ander in private functies kunt stoppen. Anders heb je kans dat je dadelijk een ontzettend grote functie krijgt, welke onleesbaar wordt.
Dit is voor een groot gedeelte al het geval, de class die ik daarboven neerzet is alleen het aanmaken van het pakketje (maar ik mag er idd wel een private van maken :+ bedankt voor het herinneren hieraan :)

PHP:
1
2
3
4
5
6
7
8
9
10
    function createDomain($host, $gen_params, $host_params, $pref_params = null, $limit_params = null){
        $curl = $this->curlInit($host);
        $packet = $this->domainCreatePacket($gen_params, $host_params, $pref_params, $limit_params);
        echo $packet;
        $response = $this->sendRequest($curl, $packet);
        echo $response;
        if($this->parseResponse($response)){
            return true;
        }
    }


Dat zou dan de public function worden en de rest privates :) (die echo's zijn alleen maar om ff te debuggen)

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


Acties:
  • 0 Henk 'm!

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 26-04-2024

Jeffroiscool

Proud DD Member! :D

Topicstarter
Sorry voor de bump maar nogmaals bedankt allemaal.

@kaesve

Ik heb nog een aanpassing gemaakt dat ik alsnog maar altijd 1 array hoef mee te geven :)

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
    private function domainCreatePacket($params){
        // Create new XML document.
        $xml = new DomDocument('1.0', 'UTF-8');
        $xml->formatOutput = true;
        
        // Create packet
        $packet = $xml->createElement('packet');
        $packet->setAttribute('version', '1.4.2.0');
        $xml->appendChild($packet);
        $client = $xml->createElement('domain');
        $packet->appendChild($client);
        $add = $xml->createElement('add');
        $client->appendChild($add);
        
        // Add general setup and optional parameters 
        foreach($params as $name => $values) { 
            $node = $xml->createElement($name); 
            $add->appendChild($node); 
            if($name == 'hosting'){
                $node2 = $xml->createElement($params['gen_setup']['htype']);
                $node->appendChild($node2);
                $node = $node2;
            }
            foreach ($values as $key => $value) { 
                $xmlelement = $xml->createElement($key, $value); 
                $node->appendChild($xmlelement); 
            } 
        } 
        return $xml->saveXML();
    }

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W

Pagina: 1