|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2014-10-03 20:05 UTC] pegasus at vaultwiki dot org
Description:
------------
Per the description, $this is null inside an eval, even if the eval is in the object's scope.
Test script:
---------------
class Test
{
public $hello = 'hi';
public function test()
{
eval('echo $this->hello;');
}
}
$o = new Test();
$o->test();
Expected result:
----------------
Expect to see printed
hi
Checking $this itself reveals NULL.
Actual result:
--------------
Nothing printed
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Dec 14 22:00:01 2025 UTC |
It has nothing to do with the eval, and has to do with $this not being available from an included script. Create second file called hello.php: #### <php? echo $this->hello; #### Use this test case from another file: #### class Test { public $hello = 'hi'; public function testNow() { require('hello.php'); } } $o = new Test(); $o->testNow(); ####Okay, yes hello.php does output 'hi' as expected, but the content is changed to ### var_dump($this); ### It outputs NULL, which is not expected, especially since var_dump($this->hello) results in string(2) "hi". Now, to get hello.php to stop outputting 'hi' altogether, my hello.php is more complicated (and closer to the format of the real code that isn't working): #### if (!function_exists('test_fn')) { function test_fn(&$obj) { echo $obj->hello; } class NestedTest { public function doubleTest($obj) { echo $obj->hello; } } } test_fn($this); // outputs nothing, expected 'hi' $o2 = new NestedTest(); $o2->doubleTest($this); // also outputs nothing, expected 'hi' ####