3v4l.org

run code in 200+ php & hhvm versions
Bugs & Features
<?php namespace{ function foo(){ echo "I'm (g)root!\n"; } function foo2(){ echo "I'm (g)root2!\n"; } function foo3(){ echo "I'm (g)root3!\n"; } } namespace Baz{ Class Test { function foobar(){ foo3(); } } Class Test2 { function foobar(){ foo3(); } } echo 'Function resolved at runtime so output changes' . "\n"; foo(); if(true){function foo(){ echo "I'm not (g)root!\n"; }} foo(); echo '------' . "\n"; echo 'Call for test purpose before Baz\foo3() has been defined' . "\n"; $test = new Test(); $test->foobar(); echo '------' . "\n"; echo 'Function resolved at parsing time so output does not change' . "\n"; foo2(); function foo2(){ echo "I'm not (g)root2!\n"; } foo2(); echo '------' . "\n"; echo 'Function resolved at runtime so output changes' . "\n"; foo3(); eval("namespace Baz; function foo3(){echo 'I\'m not (g)root3!\n';}"); foo3(); echo '------' . "\n"; echo 'Method has already been called so using the old version' . "\n"; $test->foobar(); echo 'Method is called for the first time so using the new version' . "\n"; $test2 = new Test2(); $test2->foobar(); }
Output for 5.6.30, 7.0.28 - 7.2.9
Function resolved at runtime so output changes I'm (g)root! I'm not (g)root! ------ Call for test purpose before Baz\foo3() has been defined I'm (g)root3! ------ Function resolved at parsing time so output does not change I'm not (g)root2! I'm not (g)root2! ------ Function resolved at runtime so output changes I'm (g)root3! I'm not (g)root3! ------ Method has already been called so using the old version I'm (g)root3! Method is called for the first time so using the new version I'm not (g)root3!
Output for hhvm-3.18.5 - 3.22.0
Function resolved at runtime so output changes I'm (g)root! I'm not (g)root! ------ Call for test purpose before Baz\foo3() has been defined I'm (g)root3! ------ Function resolved at parsing time so output does not change I'm not (g)root2! I'm not (g)root2! ------ Function resolved at runtime so output changes I'm (g)root3! I'm not (g)root3! ------ Method has already been called so using the old version I'm not (g)root3! Method is called for the first time so using the new version I'm not (g)root3!