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

 ID:               51527
 Comment by:       hnzksq at gmail dot com
 Reported by:      weierophin...@php.net
 Summary:          is_callable() returning true for non-static callbacks
 Status:           Open
 Type:             Bug
 Package:          Class/Object related
 Operating System: Linux
 PHP Version:      5.3.2

 New Comment:

<?php



/**

 * @author zhouw

 * @copyright 2010

 */



class Foo

{

    public function bar()

    {

        return 'foo bar';

    }

}



$callback = array('Foo', 'bar');

if (is_callable($callback)) {

    echo call_user_func($callback);

}



?>



我测试可以用的。


Previous Comments:
------------------------------------------------------------------------
[2010-05-07 16:39:56] crrodriguez at opensuse dot org

philduby at phriendly dot net : what you mention seems to be  another 

bug/misfeature.

------------------------------------------------------------------------
[2010-05-05 07:03:50] philduby at phriendly dot net

Another variation that actually (unexpectedly) works:

Calling is_callable and call_user_func from inside an instance
(non-static) method using any of: 'self::otherInstanceMethod',
array('self','otherInstanceMethod'), array(self,'otherInstanceMethod')
succeed.  It appears that (the context for) '$this' is carried over from
the original method, even though the calls are being done statically.



Calling self::otherInstanceMethod() directly also succeeds.  It appears
that methods called from an instance method 'inherit' the context for
$this.  A bit unexpected, but *reasonable*.

Win XP SP3

PHP 5.3.1 (xampp)

------------------------------------------------------------------------
[2010-04-12 11:50:33] paj...@php.net

I don't like the optional flag idea. You can disable strictness using
error_reporting already.



However I would like to see this change in trunk, can you come up with a
RFC pls?

------------------------------------------------------------------------
[2010-04-10 20:19:45] weierophin...@php.net

@johannes Perhaps an optional "strict" flag to is_callable() would
address this? 

That would keep BC, while allowing for better checking for >= PHP-5
apps. Usage 

would be:



$callback = array('Foo', 'bar');



if (is_callable($callback, true)) {

    // Passed strict check

} else {

    // failed strict check

}



Thoughts?

------------------------------------------------------------------------
[2010-04-10 17:55:25] johan...@php.net

The method can always be called statically. The access to $this might be
forbidden but the method itself can be called. is_callable() doesn't
mean it will execute properly. (the $this error is basically the same as
a call to an undefined funciton in there or such)



To change this the only way would be to forbid calling non-static
methods statically. Maybe this can be done nowadays (we needed the
behavior for PHP 4 compatibility) but that's no bug but requires a RFC
and discussion on internals as this might break quite a few applications
(many PEAR-based things, many legacy applications not fully "converted"
to PHP 5 ....)

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


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/bug.php?id=51527


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

Reply via email to