[PHP] Functie verwijzen naar een andere functie

Pagina: 1
Acties:
  • 159 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Werelds
  • Registratie: Juli 2007
  • Laatst online: 14-09 12:58
Beste tweakers,

Sinds kort ben ik weer eens bezig met een website, na lange tijd niets gedaan te hebben. Ondertussen heb ik wel veel met C, C++ en C# gewerkt, en nu wil ik in PHP een aantal dingen proberen. Ik ben met de C varianten veel verder gegaan dan ooit met PHP, en dat wil ik nu dus terug voeren.

Wat ik mij afvroeg, is of het mogelijk is een functie een reference te laten zijn naar een andere functie.

Het idee:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Class1 {
    tmpClass2 = new Class2();
    function C1F1() = tmpClass2->C2F1;
}

class Class2 {
    function C2F1($arg1, $arg2 = false) {
        /* ... */
    }
}

class Class3 {
    function C3F1($arg1, $arg2 = false, $arg3) {
        /* ... */
    }
}


Idee is dus dat de eerste class aangemaakt wordt, deze op zijn beurt Class2 danwel Class3 aanmaakt (afhankelijk van een aantal parameters), en dat dan vanuit het hoofdscript gewoon gebruikt gemaakt wordt van de dummy functies in Class1 die gelinkt zijn naar functies in Class2/Class3; met behoud van de parameters.

Klinkt misschien raar, maar ik heb hier zo m'n redenen voor :P

Iemand een idee? Heb al een aantal dingen geprobeerd, maar helaas :(

Acties:
  • 0 Henk 'm!

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 21-09 10:08

Spockz

Live and Let Live

wat je wel kunt doen is de tekstidentifier dus bijv Class1::Je_Functie in een string te zetten en die met call_user_func aan te roepen, voor statische functies. Of zo:

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
class myclass {
    function say_hello()
    {
        echo "Hello!\n";
    }
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));


Courtesy of php.net/function.call-user-func.php. :)

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Of zoiets:
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
class Base
{
    function Base($which)
    {
        switch ($which)
        {
            case 1:
                $this->sub = new Sub1();
                break;
            case 2:
                $this->sub = new Sub2();
                break;
        }
    }

    function waa()
    {
        $this->sub->waa();
    }
}

class Sub1
{
    function waa()
    {
        echo 'This is waa() from Sub1<br>';
    }
}

class Sub2
{
    function waa()
    {
        echo 'This is waa() from Sub2<br>';
    }
}

$foo = new Base(1);
$foo->waa();

$bar = new Base(2);
$bar->waa();

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

@TS:
Waarom zou je dat in dit geval zo willen? Van wat ik heb begrepen uit je code wil je in feite gewoon delegeren toch? Ik weet niet of PHP daar zelf mechanismen voor aanbiedt om method pointers toe te staan en al helemaal niet type safe method pointers, maar je hebt zover ik kan zien dit ook niet nodig voor jouw constructie.

Immers volstaat het volgende toch ook?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Class1 {
    private $blaat;
    public function __construct() {
        $this->blaat = new Class2();
    }

    public function delegateFoobar() {
        $this->blaat->foobar();
    }
}

class Class2 {
    public function foobar() {
        //...
    }
}


Natuurlijk wel netjes je argumenten meegeven.

edit:

Crisp :'(

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Kan ook algemener trouwens:

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
class Foo {
  private $child;

  public function __construct ($class = false) {
    if (class_exists($class))
      $this -> child = new $class;
  }

  public function __call ($function, $arguments) {
    if(method_exists($this -> child, $function))
      $this -> child -> $function($arguments);
  }
}


class One {
  public function bar () {
    echo "One bar.";
  }
}

class Two {
  public function bar () {
    echo "Two bars.";
  }
}

$foo = new Foo('One');
$foo -> bar(); // Echo's 'One bar.';

$foo = new Foo('Two');
$foo -> bar(); // Echo's 'Two bars.';


Hiermee kun je willekeurig welke class gebruiken om te callen en willekeurig welke public functie in die class aanroepen zonder 'm eerst te hoeven definieren. Laat je nu nog vrij weinig zien als er iets mis gaat maar dat kun je prima zelf toevoegen met exceptions (of wat je voorkeur maar heeft).

* FragFrog is een groot liefhebber van magic methods :)

[ Voor 21% gewijzigd door FragFrog op 20-01-2008 13:24 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Sh4wn
  • Registratie: December 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

PHP's eigen callback 'type' is

- Bij een functie: gewoon een string met de functie naam
- Bij een static method: een array met key0 de class name en key1 de functie naam
- Bij een niet static method: een array met key0 de instantie, en key1 een string met de functie naam

Zo zou je in principe verder kunnen lijkt mij :)

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Ik heb je vraag even opnieuw gelezen en ik zie dat ik 'm een beetje verkeerd had opgevat. Wat je eigenlijk zoekt imho is de factory pattern. Het is een generalisatie van de oplossing van crisp, en ik raad je aan om er even naar te googlen.
Pagina: 1