php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #46409 __invoke method called outside of object context when using array_map
Submitted: 2008-10-28 20:17 UTC Modified: 2008-11-28 09:42 UTC
From: phpbugs at sevenlight dot com Assigned: dmitry (profile)
Status: Closed Package: Scripting Engine problem
PHP Version: 5.3CVS-2008-11-11 OS: *
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: phpbugs at sevenlight dot com
New email:
PHP Version: OS:

 

 [2008-10-28 20:17 UTC] phpbugs at sevenlight dot com
Description:
------------
When using a custom class as a callback object, the array_map (and possibly other methods) call the method outside of the object's context.

I was using this as the __invoke() method to test:

        if (!isset($this)) {
            die('Outside of object context.');
        } else {
            return $this->val;
        }

This may be the best way to setup the PHP unit test script.

Again I did not test this on other callback functions, but it very easily could be happening on those as well.

Reproduce code:
---------------
<?php
class Callback
{
    protected $val = 'hello, world';
    
    public function __invoke()
    {
        return $this->val;
    }
}

$cb = new Callback();

// straight callback
if ($cb() != 'hello, world') {
    die('error');
}

// array_map
$a = array(1, 2, 3);
$b = array_map($cb, $a);
print_r($b);
?>

Expected result:
----------------
Array
(
    [0] => hello, world
    [1] => hello, world
    [2] => hello, world
)


Actual result:
--------------
PHP Fatal error:  Using $this when not in object context in /srv/www/test/closure.php on line 8


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2008-11-28 09:42 UTC] dmitry@php.net
This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.


 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Tue Jul 01 04:01:36 2025 UTC