Avatar billede madsleejensen Nybegynder
25. juni 2007 - 17:56 Der er 10 kommentarer og
1 løsning

kald function med args fra array

Hejsa ..

jeg sidder og leger lidt med et par scripts.. sidder og leger lidt med __call ( $name ,$args )  magic i php5

nu er det sådan at jeg gerne vil sende den hen til lad os sige

myMethod( $args )..

når jeg kalder en ukendt funktion i min klasse. men problemmet er at

class test {
function __call ( $name , $args ) {
myMethod( $args );
}
}

kun smider mine args afsted som et argument, som en array der indeholder alle de andre argument værdier sendt til min __call()

vil gerne have den deler dem op og sender dem afsted som de blev kaldt.



ukendt( "hej", "med", "dig" );

bliver til

myMethod( "hej", "med", "dig" );

har prøvet lidt med myMethod( implode ( "," , $args ) ) ; uden held..

kan det jeg ønsker overhovedet lade sig gøre.. ??
og da mit script kan kalde forskellige funktioner så kan jeg heller ikke bare lave en myMethod( $args[0], $args[1], $args[2] );

og håber heller ikke jeg bliver nød til at hive mine dataer ud i myMethod() fra den ene array den sender :)

men lad mig hører om i kender et trick :)
Avatar billede jakobdo Ekspert
25. juni 2007 - 19:10 #1
I din funktion: $myMethod($args)
kan du vel behandle arrayet efterfølgende.
Om du får:
$myMethod('et','to','tre')

Eller:
$myMethod(array('et','to','tre'))
Kan jo behandles på samme måde.
Du kan jo lave: count($args) eller bruge: $argc
Avatar billede madsleejensen Nybegynder
25. juni 2007 - 19:29 #2
ja det er jeg helt med på at man self kan .. men ville hører om andet kunne lade sig gøre ? om der var en smart måde at smide dem videre på samme måde ?
Avatar billede windcape Praktikant
25. juni 2007 - 23:10 #3
www.php.net/call_user_func
www.php.net/call_user_func_array

Sidstnævnte burde løse dit problem :-)
Avatar billede jakobdo Ekspert
26. juni 2007 - 07:59 #4
Nu skyder jeg måske helt ved siden af.
Men hvad er forskellen på call_user_func_array() og så:
$myMethod($args)
{
    echo "***DEBUGGING\nVARIABLE: $var\nVALUE:";
    if (is_array($args) || is_object($args) || is_resource($args))
    {
        print_r($args);
    }
    else
    {
        echo "\n$args\n";
    }
    echo "***\n";
}
Avatar billede windcape Praktikant
28. juni 2007 - 02:48 #5
at $args kun ville virke som første argument :-)

function foo($a1,$a2,$a3) {} = 3 argumenter

$args = array(1,2,3)
foo($args) = 1 argument = fejl

foo(1,2,3) = 3 argumenter = virker
Avatar billede windcape Praktikant
28. juni 2007 - 02:49 #6
dog forstår jeg ikke hvorfor spørgeren ønsker at overloade via __call og alligevel kalde een metode.

Denne ene metode burde VÆRE _call, ikke kaldes derfra.
Avatar billede madsleejensen Nybegynder
28. juni 2007 - 12:15 #7
jeg vil redirect et kald af funktion til en instance af en anden klasse

class c1 {
private $instace;

function __construct () {
$this->instance = new c2();
//med lidt statements kan min instance være til andre klasser
}

function __call( $name , $args ) {
$this->instance->$name($args);
}


}


$m = new c1();
$c1->method(1,2,3,4);
Avatar billede windcape Praktikant
28. juni 2007 - 21:00 #8
ja, det skal så være

<?php

class Foo
{
    public function __call($method,$args) {
        $bar = new Bar();
        return call_user_func_array(array($bar,$method),$args);
    }
}

class Bar
{
    public function sayHi($name) {
        return 'Hi '.$name;
    }
}

$foo = new Foo();
echo $foo->sayHi('Windcape');

?>
Avatar billede madsleejensen Nybegynder
29. juni 2007 - 14:19 #9
perfekt smid svar :)
Avatar billede windcape Praktikant
30. juni 2007 - 05:37 #10
moooooooooooooooooooo :-)
Avatar billede madsleejensen Nybegynder
30. juni 2007 - 19:02 #11
jeg takker! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester