Re: [PHP] PHP 4.3.11, call_user_func and instances of classes

2006-04-27 Thread Richard Lynch
On Wed, April 26, 2006 6:46 pm, David Otton wrote:
 class Test {
 var $x;
 function Test ()
 {
 global $addition, $subtraction;
 $this-x = 0;
 $addition = array ($this, 'AddOne');
 $subtraction = array ($this, 'SubtractOne');

Unsolicited Advice:

You MIGHT also want to consider using $this-addition and
$this-subtraction instead of global variables.

Just a bit cleaner, I think.

-- 
Like Music?
http://l-i-e.com/artists.htm

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[PHP] PHP 4.3.11, call_user_func and instances of classes

2006-04-26 Thread David Otton
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



Re: [PHP] PHP 4.3.11, call_user_func and instances of classes

2006-04-26 Thread Martin Alterisio
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