Bug #51527 [Com]: is_callable() returning true for non-static callbacks

From: Date: Tue, 20 Jul 2010 03:43:43 +0000
Subject: Bug #51527 [Com]: is_callable() returning true for non-static callbacks
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-152538@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=51527&edit=1

 ID:               51527
 Comment by:       hnzksq at gmail dot com
 Reported by:      weierophinney@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] pajoye@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] weierophinney@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] johannes@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


Thread (12 messages)

« previous php.bugs (#152538) next »