ID:               22237
 Comment by:       rep at devdomain dot com
 Reported By:      peter at globalvision dot com dot au
 Status:           Closed
 Bug Type:         Zend Engine 2 problem
 Operating System: All
 PHP Version:      5CVS-2003-02-15 (dev)
 New Comment:

Not closed! Using September's 28 PHP5 CVS:

PHP Fatal error:  Method name must be a string in
/www/var/template/%%-16/%%-1606537564/Contact.en.tpl.php

And the php file goes like this: 

<?php echo $this->_plugins['function']['mailto'][0](array('address' =>
"[EMAIL PROTECTED]",'encode' => 'javascript'), $this) ; ?>

(Smarty template.)
With this postfilter it works fine:

function dev_smarty_php5b1_fix_postfilter ($sTpl, &$oSmarty) {

  return preg_replace (
    '/echo (\$this-\>_plugins\[\'\w+\'\]\[\'\w+\'\]\[\d+\])/',
    '$dev_php5b1_fix = "{\1}"; echo $dev_php5b1_fix', $sTpl);
}


Previous Comments:
------------------------------------------------------------------------

[2003-04-19 20:06:16] peter at globalvision dot com dot au

Yup.. confirmed that the latest CVS no longer crashes...

------------------------------------------------------------------------

[2003-04-18 18:14:16] thekid at thekid dot de

No crash here.

In line 1, I assume you're expecting "hi" as an output. This will of
course not work as $bar is not set.

Modify line 1 to read:
  echo $this->{$this->bar}

and you will have your expected output. Note that with
error_reporting(E_ALL) you would notice such kinds of mistakes. Also,
var_dump() helps a lot, you can actually see type information instead
of just nothing appearing:)

[EMAIL PROTECTED]:~ > cat | php5
<?php
class myClass
{
    var $foo = "hi";
    var $bar = "foo";

    function test()
    {
      var_dump($this->{$this->bar});
      var_dump($this->foo);
    }
}

$c= new myClass();
$c->test();
?>
string(2) "hi"
string(2) "hi"

------------------------------------------------------------------------

[2003-03-23 06:46:27] peter at globalvision dot com dot au

Well... I have not had the time to solve it, but I now know pretty well
why it is caused.

**can someone please have a crack at fixing this**?

In zend_language_parser.y, the rule for object_property is either an
object_dim_list (which can be a T_STRING) or it is a
"variable_without_ibjects".

object_dim_list works for $this->foo, but $this->$foo is matched by
variable_without_objects.

HOWEVER, variable_without_objects is the match for vanilla variables,
so it consumes one '$' before it dereferences.

in other words, $this->$foo sends the $foo part off to the standard
variable compiler area which does not recognise that $foo is a
reference.

I experimented by placing a couple of rules in the lex scanner as
follows:

<ST_LOOKING_FOR_PROPERTY>"$" {

fprintf(stderr,"xxx");

  yy_push_state(ST_TEST)
  return '$';
}

and

<ST_TEST>";" {

fprintf(stderr,"yyy");

  yy_pop_state(TSRMLS_C);
  return ';';
}
<ST_TEST>{LABEL} {

fprintf(stderr,"zzz");

   zendlval->value.str.val = (char *)estrndup(yytext,yyleng);
   zendlval->value.str.len = yyleng;
   zendlval->type = IS_STRING;
   return T_VARIABLE;
}

and suddenly, it all seems to parse, however I'm clearly missing
something - it still does not display the forrect output for

  echo $this->$foo;

What am I doing wrong?

------------------------------------------------------------------------

[2003-02-22 17:08:49] peter at globalvision dot com dot au

I'm assuming all OSes b/c my original report was MS Windows but a
subsequent dup report was for Linux.

I've narrowed it down a bit by running with debug mode on the ZE2

I'm 99% sure it is due to the way zend treats "$this" as special. I
don't think it's putting all the required data on the stack.

Specifically, when it processes the base_variable_without_objects bison
rule after reading T_OBJECT_OPERATOR (ie -> ) it sets yyval.u.EA.type
(see case 363 in zend_language_parser.c) but yyval.u is zero at that
time when the LH operand is $this.

Not sure why yet...

EG the following modification causes no crash:
<?php
class myClass
{
    var $foo = "hi";
    var $bar = "foo";

    function test()
    {
      $t = &$this;
      echo $t->$bar;
      //echo $this->foo;
    }
}
?>

------------------------------------------------------------------------

[2003-02-19 06:26:45] root at kitten dot net

This is pretty serious... it prevents pear from working. Can someone
please take a look at it?

Thanks

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/22237

-- 
Edit this bug report at http://bugs.php.net/?id=22237&edit=1

Reply via email to