The problem is not what it seems. PHP4 assigns object by copy, not by
reference. This is causing the call_user_func() to use a copy of the object
instead of the original object. So, all modifications are lost once the call
is done. One solution to this is to assign objects by reference:
$addition = array (&$this, 'AddOne');
$subtraction = array (&$this, 'SubtractOne');
2006/4/26, David Otton <[EMAIL PROTECTED]>:
>
> A bit of an oddity, this. There's some example code attached which
> illustrates my problem.
>
> I am attempting to call a method of an instance of an class from
> outside that instance, using call_user_func().
>
> What's happening is that my attempt to call
>
> array ($this, 'AddOne')
>
> is silently being rewritten into a call to
>
> array ('Test', 'Addone')
>
> in other words, instead of calling $test->AddOne I'm calling
> Test::Addone. Thus, my expected output:
>
> Add:1,Add:2,Add:3,Subtract:2,Subtract:1,Subtract:0,
>
> becomes
>
> Add:1,Add:1,Add:1,Subtract:-1,Subtract:-1,Subtract:-1,
>
> So, my question is twofold:
>
> a) How can I accomplish this?
>
> b) Why is PHP silently modifying my code to mean something I didn't
> write, rather than throwing up an error?
>
> <?php
> $addition = $subtraction = null;
>
> class Test {
> var $x;
> function Test ()
> {
> global $addition, $subtraction;
> $this->x = 0;
> $addition = array ($this, 'AddOne');
> $subtraction = array ($this, 'SubtractOne');
> doMath('+'); doMath('+'); doMath('+');
> doMath('-'); doMath('-'); doMath('-');
> }
> function AddOne ()
> {
> $this->x++;
> echo ("Add:".$this->x.",");
> }
> function SubtractOne ()
> {
> $this->x--;
> echo ("Subtract:".$this->x.",");
> }
> }
>
> function doMath($choice)
> {
> global $addition, $subtraction;
> switch ($choice)
> {
> case '+':
> call_user_func ($addition);
> break;
> case '-':
> call_user_func ($subtraction);
> break;
> }
> }
>
> $test = new Test();
> ?>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>