Nasty Parser Bug

php.internals

Sterling Hughes

23 years ago
Hey, Bug 24441 (http://bugs.php.net/bug.php?id=24441), displays the following problem: <?php class test { var $filter = 'hello'; var $array = array('hello', 'hello world', 'hey there'); function test() { array_filter($this->array, array($this, 'filter')); } function filter ($value) { return preg_match("/{$this->filter}/i", $value); } } $t = new test; var_dump($t->filter('hello world')); ?> That script (also attached), will give an error: Fatal error: Using $this when not in object context in /data/home/sterling/work/os/php/php-src/arraybug.php on line 11 If you comment out the test() function declaration, everything will work as expected. -Sterling
-- "First they ignore you, then they laugh at you, then they fight you, then you win." - Gandhi

Timm Friebe

23 years ago
On Wed, 2003-07-02 at 06:34, Sterling Hughes wrote: [...]
> $t = new test; > var_dump($t->filter('hello world'));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Changing this line to: var_dump(call_user_func(array($t, 'filter'), 'hello world')); or even $t= new Reflection_Method('test', 'filter'); var_dump($t->invoke(new test(), 'hello world')); yields the same bug. ZE1 outputs "int(1)". ZE2 does so, too, if I rename "test" to anything else (except "__construct", which causes the same problem). The same problem arises for other array functions such as usort, array_map etc., but _not_ for call_user_func(_array). After short investigation it looks like all of these use fast_call_user_function() but do not pass an object_pp. Either this should be patched in ext/standard/array.c or fast_call_user_function shoud check for the callback being an array($obj, $func) / array($class, $func) *even* when a function pointer is passed. - Timm

Sterling Hughes

23 years ago
On Wed, 2003-07-02 at 10:11, Timm Friebe wrote:
> On Wed, 2003-07-02 at 06:34, Sterling Hughes wrote: > [...] > > $t = new test; > > var_dump($t->filter('hello world')); > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > Changing this line to: > var_dump(call_user_func(array($t, 'filter'), 'hello world')); > > or even > $t= new Reflection_Method('test', 'filter'); > var_dump($t->invoke(new test(), 'hello world')); > > yields the same bug. > > ZE1 outputs "int(1)". ZE2 does so, too, if I rename "test" to anything > else (except "__construct", which causes the same problem). > > The same problem arises for other array functions such as usort, > array_map etc., but _not_ for call_user_func(_array). > > After short investigation it looks like all of these use > fast_call_user_function() but do not pass an object_pp. Either this > should be patched in ext/standard/array.c or fast_call_user_function > shoud check for the callback being an array($obj, $func) / array($class, > $func) *even* when a function pointer is passed.
Then why would it work if test() is undefined? Further, why would it work when no array functions are used (as with my original example). I think you might be right that this is a separate bug, but its certainly not the same bug that I'm talking about. -Sterling
> > - Timm
-- "Nothing is particularly hard if you divide it into small jobs." - Henry Ford