Edit report at https://bugs.php.net/bug.php?id=64346&edit=1

 ID:                 64346
 User updated by:    gen dot work at gmail dot com
 Reported by:        gen dot work at gmail dot com
 Summary:            Function name resolution and eval
-Status:             Feedback
+Status:             Assigned
 Type:               Bug
 Package:            *General Issues
 Operating System:   Ubuntu 12.10
 PHP Version:        5.4.12
 Assigned To:        dmitry
 Block user comment: N
 Private report:     N

 New Comment:

The main issue I see is that is_callabe() is lying. It says that '\Foo\bar' is 
callable, but in fact it's not. So just document this behavior is not enough 
imo, is_callabe should be tweaked to reflect actual status.

And I don't quite understand suggested workaraund. Could you please give a 
simple example? In my usecase I try to mock time function to avoid sleep() 
calls:
https://github.com/rybakit/phive-queue/blob/master/tests/Phive/Tests/Queue/AbstractQueueTest.php#L59
https://github.com/rybakit/phive-queue/blob/master/src/Phive/Queue/InMemoryQueue.php#L40


Previous Comments:
------------------------------------------------------------------------
[2013-03-04 13:50:20] larue...@php.net

@gen the main brief is, when you first call to \Foo\Bar,  the 'time' constant 
in 
the \Foo\Bar function, will bundle to "time function", in the first time , it 
obviously will be bundled to \time.

then when you sencond call to it. PHP will use that cache instead of look up in 
function table again for "time" function, to increase performance..

so, if we disable the cache, then performance slowdown...

what do you think?  a workaround is define a Foo\Bar2, after you eval, you call 
to it, then it will bundled to \Foo\Time..

------------------------------------------------------------------------
[2013-03-04 13:43:29] larue...@php.net

or maybe we should document this behavior, since disable it will bring 
performance 
issue

------------------------------------------------------------------------
[2013-03-04 10:38:17] larue...@php.net

confirm this change. this is due to the 5.4 performance improvement: "literal 
cache"

@dmitry, maybe we should not cache the function entry for INIT_NS_FCALL?

thanks

------------------------------------------------------------------------
[2013-03-04 10:11:24] gen dot work at gmail dot com

Description:
------------
The code below works as expected on version 5.3.

Test script:
---------------
namespace Foo {
    function bar() {
        var_dump(is_callable('Foo\\time'));
        var_dump(time());
    }
}

namespace {
    \Foo\bar();
    eval('namespace Foo; function time() { return -1; }');
    \Foo\bar();
}

Expected result:
----------------
bool(false)
int(1362390237)
bool(true)
int(-1)


Actual result:
--------------
bool(false)
int(1362390237)
bool(true)
int(1362390237)


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



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

Reply via email to