php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #73118 is_callable callable name reports misleading value for anonymous classes
Submitted: 2016-09-20 04:58 UTC Modified: 2016-09-20 05:07 UTC
From: nihylum at gmail dot com Assigned:
Status: Closed Package: Class/Object related
PHP Version: 7.0.11 OS: any
Private report: No CVE-ID:
 [2016-09-20 04:58 UTC] nihylum at gmail dot com
Description:
------------
Tested on:
- PHP 7.0.8 ( eval.in )
- PHP 7.1.0beta3 via brew (OSX)

Whenever you analyze a callable that is defined by an anonymous class the callable name remains to be "class@anonymous" instead of the real callable name.

Solution 1:

Modify the callable name construction for anonymous classes to this pattern:
class@anonymous::<method>

Solution 2:

Attach a 4th parameter $resolveAnonymous (that defaults maybe to true, or false for backward compatibility). If set to true each anonymous class and closures will be automatically resolved to its object hash enclosed into box brackets as the class name part of the callable name value (the brackets because of pattern isolation from real class names).

Solution 3 (my favorite):

Solution 1 + 2 combined.

Test script:
---------------
<?php

trait callback {
  public function __invoke($who)
  {
    return 'hello world';
  }
}

class foo { use callback; }

$inline = new class { use callback; };

var_dump(
  is_callable($inline, false, $target),
  $target,
  is_callable([$inline, '__invoke'], false, $target),
  $target,
  is_callable(new foo, false, $target),
  $target
);

Expected result:
----------------
bool(true)
string(15) "class@anonymous"
bool(true)
string(15) "class@anonymous"
bool(true)
string(13) "foo::__invoke"

Actual result:
--------------
Solution 1:

bool(true)
string(15) "class@anonymous::__invoke"
bool(true)
string(15) "class@anonymous::__invoke"
bool(true)
string(13) "foo::__invoke"

Solution 2:

bool(true)
string(15) "[000000003cc480c70000000035210066]::__invoke"
bool(true)
string(15) "[000000003cc480c70000000035210066]::__invoke"
bool(true)
string(13) "foo::__invoke"

Patches

Add a Patch

Pull Requests

Pull requests:

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2016-09-20 05:07 UTC] nihylum at gmail dot com
Well, i was sure i targeted the correct boxes for expected and actual result (at this bug report currently interchanged). Sorry, my bad. :/
 [2017-02-11 23:16 UTC] nikic@php.net
Automatic comment on behalf of as
Revision: http://git.php.net/?p=php-src.git;a=commit;h=7e5cf2aa194a45470efe1fbe590ebff74034df14
Log: Fixed bug #73118
 [2017-02-11 23:16 UTC] nikic@php.net
-Status: Open +Status: Closed
 
PHP Copyright © 2001-2017 The PHP Group
All rights reserved.
Last updated: Wed Jun 28 19:01:44 2017 UTC