Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Funktion parametrina funktio

Puple [20.07.2012 11:32:31]

#

Siinähän se ongelma jo tulikin. Tarvitsisi siis saada funktion parametriksi määriteltyä toinen funktio.

Eli tähän tapaan:

<?php
function f2() {
  echo "jotain";
}

function f1(fp()) { // virhe tässä rivissä
  fp();
}

f1(f2());
?>

pitäisi tulostaa "jotain" mutta tulostuu vain virhe...
Parse error: syntax error, unexpected '(', expecting '&' or T_VARIABLE
...koskien ko. yllä merkattua riviä.

EDIT: Ja kysymys oli siis, että miten? Tuon ongelman ratkaisemista tarvitsen siis eräässä toisessa koodissa, joten pitäisi saada nimenomaan tuolleen, muttakun valittaa että väärän tyyppinen. Onko tuo mitenkään mahdollista saada?

Jaska [20.07.2012 11:44:48]

#

Toimisiko call_user_func? PHP:ssä on myös muuttujafunktioita.

Grez [20.07.2012 11:49:02]

#

Funktion parametrit on muuttujia. Eli sinne funktion määrittelyn sulkeiden sisään pitää laittaa muuttujia ( $jotain ) eikä kutsua siellä jotain funktiota ( fp() )

Eli siis

<?php
function f2() {
  echo "jotain";
}
function f1($funktionimi) {
  $funktionimi();
}
f1('f2');

Jos on vanha PHP, joka ei tue tätä niin sitten Jaskan call_user_func-linkin mukaisesti. (Ja Jaska editoikin myös maininnan näistä muuttujafunktioista, joita esimerkissäni käytin)

Tukki [20.07.2012 13:48:20]

#

Grez kirjoitti:

Funktion parametrit on muuttujia. Eli sinne funktion määrittelyn sulkeiden sisään pitää laittaa muuttujia ( $jotain ) eikä kutsua siellä jotain funktiota ( fp() )

Funktion parametriksi voi kyllä antaa muutakin kuin vain muuttujia, esimerkiksi vakioita (DIRECTORY_SEPARATOR), lausekkeita ($a > 3 tai $a < $b ? 2 : 3), funktiokutsuja (strlen($a)) ja anonyymejä funktioita. Funktio saa parametrien arvot muuttujissa käsiteltävikseen.

Tuo anonyymi funktio (klosuuri) voisi olla se mitä tässä haetaan. Sen sijaan että annetaan parametrina funktion nimi, voidaan suoraan antaa funktion määrittely näin:

function_that_takes_function_as_parameter(function() {
    echo "parameter function";
  }
);

ja käyttö vastaavasti kuin Grezin esimerkissä:

function function_that_takes_function_as_parameter($func) {
  $func();
}

Toki anonyymin funktion voi myös tallettaa muuttujaan ja antaa sen muuttujan parametrina.

Grez [20.07.2012 14:16:58]

#

Tukki kirjoitti:

Funktion parametriksi voi kyllä antaa muutakin kuin vain muuttujia, esimerkiksi vakioita (DIRECTORY_SEPARATOR), lausekkeita ($a > 3 tai $a < $b ? 2 : 3), funktiokutsuja (strlen($a)) ja anonyymejä funktioita. Funktio saa parametrien arvot muuttujissa käsiteltävikseen.

Puhuin funktion parametreista ja funktion määrittelystä. Toki funktioita kutsuttaessa ko. muuttujien arvot voi määrittää "lennossa" eli funktiokutsun sisällä.

Vai meinaatko tosissasi, että tällainen olisi kelpo funktio:

function TukinFunktio(DIRECTORY_SEPARATOR, $a < $b ? 2 : 3) {
    echo "$a ja $b";
}

Tukki [20.07.2012 16:07:16]

#

Grez kirjoitti:

Vai meinaatko tosissasi, että tällainen olisi kelpo funktio:

function TukinFunktio(DIRECTORY_SEPARATOR, $a < $b ? 2 : 3) {
    echo "$a ja $b";
}

En meinaa. Kommenttisi ensimmäisen lauseen perusteella saattaa vaan vaada sen käsityksen että väität että tämäkään ei olisi mahdollista:

TukinFunktio(DIRECTORY_SEPARATOR, $a < $b ? 2 : 3);

ja tarkensin ettei näin ole. Tässä on kaksi eri asia: se miten funktiolle voi antaa arvoja parametrina ja se miten funtkio saa nuo arvot käsiteltäväkseen. Toinen pointti oli se että parametrina annettava arvo voi olla suoraan funktiomäärittely eikä sen tarvitse olla funktion nimi.

Metabolix [20.07.2012 16:17:04]

#

Tukin mainitsemat asiat ovat argumentteja eivätkä parametreja.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta