[PHP] Dynamisch aanroepen methode...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de volgende code:

PHP:
1
$ret .= $this->_tpl_class->framework($this->_tpl_data[$cur_tpl_name][$cur_iter]);


Nu lijkt het me duidelijk dat ik dynamisch wil kunnen bepalen welke functie ik aanroep.
Ik wil namelijk niet alle templates gaan hardcoden ;) Is zo lastig met updates.

Ik heb volgens mij al alles geprobeerd en kan op php.net niet vinden hoe het wel moet :(

PHP:
1
2
$func_name = "$this->_tpl_class->framework";
$ret .= $func_name($this->_tpl_data[$cur_tpl_name][$cur_iter]);


Zoiets zoek ik dus alleen dan werkend ;)

Acties:
  • 0 Henk 'm!

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 19-09 09:59
Beetje ranzig:

PHP:
1
2
3
4
5
6
7
<?php

$func = "phpinfo";

eval($func."();");

?>

zeroxcool.net - curity.eu


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oh ja idd, eval is er ook nog :+
Heb mezelf dat smerige trucje uit m'n hoofd verdrongen ;)

Is er iemand die een manier weet die wel mooi is? :+

Acties:
  • 0 Henk 'm!

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 19-09 09:59
PHP:
1
2
3
4
5
6
7
<?php

$func = "phpinfo";

$func(); 

?>


Dit werkt lokaal? Is net zo goed ranzig, maar dat terzijde.

[ Voor 169% gewijzigd door zeroxcool op 27-06-2005 11:57 . Reden: nu wel :] ]

zeroxcool.net - curity.eu


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik weet dat het zo als jij het doet wel werkt. Maar met classes werkt het niet :(

Edit: Voorlopig heb ik het opgelost met eval maar als er iemand een ander idee heeft dan houdt ik me aanbevolen want ik vind eval wel zo smerig :r

[ Voor 49% gewijzigd door Verwijderd op 27-06-2005 12:36 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Werkt prima met classes hoor:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
class AClass {
    
    function aMethod() {
        echo "called AClass::aMethod()";
    }
    
    function anotherMethod() {
        echo "called AClass::anotherMethod()";
    }
}

$a = new AClass(); 
$method = rand(0, 1) == 1 ? "aMethod" : "anotherMethod";
$a->$method();

?>

roept random de ene of de andere method aan.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Okee, dan is de $this pointer het probleem :P

Probeer je hele verhaal maar eens te testen in een class.
Ofwel dat je twee mail een -> krijgt.

In de vorm: $this->andereklasse->functieInAndereKlasse()

Dan werkt het niet meer :(

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
zo?
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
<?
class AClass {
    
    function aMethod() {
        echo "called AClass::aMethod()";
    }
    
    function anotherMethod() {
        echo "called AClass::anotherMethod()";
    }
}

class Container {
    var $unit;

    function run() {
        $method = rand(0, 1) == 1 ? "aMethod" : "anotherMethod";
        $this->unit->$method();
    }
}

$c = new Container();
$c->unit = new AClass(); 
$c->run();
?>

werkt ook hoor...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Komisch... hier niet :+

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Raar. Zowel op PHP4 als 5 werkt dat scriptje hier. Wat zegt ie bij jou dan?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Met "werkt niet" komen we nergens. Errors? Versienummers? Geef eens wat meer informatie, want hiermee kunnen we werkelijk niets.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wanneer ik het volgende doe... (zie nu pas dat er een verschil tussen die van jou en mij :( en dat er in m'n originele post een typefout zat ;))

PHP:
1
2
3
4
<?php
$func_name = "\$this->\$_tpl_class->framework";
$ret .= $func_name($this->_tpl_data[$cur_tpl_name][$cur_iter]);
?>


Dit werkt niet en dit is wel noodzakelijk wil ik het zonder eval doen.
Hierbij zijn $_tpl_class en $this allebei klasses.

Waarom $_tpl_class een variabele is? Omdat er meerdere template klasses tegelijkertijd actief zijn en $_tpl_class een iterator is langs alle template klasses.

En idd Genoil.. die van jou werkt wel.. ik had het zojuist over de mijne welke hierboven vermeld staat :) Ben nog niet zo wakker ;)

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
waarom probeer je 1 hele string te maken met this en framework erin, terwijl die toch altijd hetzelfde zijn? je kunt jouw ding ook zo opschrijven:
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
<pre>
<?
class Unit {
    
    function run() {
        echo get_class($this)."::run()\n";
    }
    
}

class FooUnit extends Unit {}
class BarUnit extends Unit {}

class Container {
    var $foo;
    var $bar;
    
    function run() {
        foreach(get_class_vars(get_class($this)) as $var => $value) {
            $this->$var->run();
        }
    }
}

$c = new Container();
$c->foo = new FooUnit();
$c->bar = new BarUnit();
$c->run();
?>
</pre>


(het gaat denk ik fout als je "->" in een string probeert te stoppen.

[ Voor 12% gewijzigd door Genoil op 27-06-2005 14:16 ]

Pagina: 1