Re: PHP 4.3.11, call_user_func and instances of classes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <phpmail@xxxxxxxxxxxxxxxxxxxxxxx>:
>
> 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
>
>

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux