php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #78895 Reflection detects abstract non-static class as abstract static
Submitted: 2019-12-02 08:13 UTC Modified: 2019-12-09 10:04 UTC
From: abashurov at plesk dot com Assigned: dmitry (profile)
Status: Closed Package: Scripting Engine problem
PHP Version: 7.4.0 OS: All
Private report: No CVE-ID: None
 [2019-12-02 08:13 UTC] abashurov at plesk dot com
Description:
------------
Initially reproduced on Arch Linux and Windows Server 2016:

php -v
PHP 7.4.0 (cli) (built: Nov 30 2019 10:43:49) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.0, Copyright (c), by Zend Technologies
    with Xdebug v2.8.0, Copyright (c) 2002-2019, by Derick Rethans

php.exe -v
PHP 7.4.0 (cli) (built: Nov 27 2019 10:13:59) ( NTS Visual C++ 2017 x64 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.0, Copyright (c), by Zend Technologies



As 3v4l shows, this behavior is exclusive to PHP 7.4: https://3v4l.org/rEqh2

Test script:
---------------
<?php
abstract class Foo
{
    abstract public function Bar();
}

$ref = new ReflectionClass(Foo::class);
var_dump(Reflection::getModifierNames($ref->getModifiers()));

Expected result:
----------------
Calling getModifiers on a non-static class does not detect it as static

Actual result:
--------------
Calling getModifiers on a non-static class detects it as static

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2019-12-02 09:04 UTC] cmb@php.net
-Status: Open +Status: Verified -Package: Reflection related +Package: Scripting Engine problem -Assigned To: +Assigned To: dmitry
 [2019-12-02 09:04 UTC] cmb@php.net
Commit 0fbd2e6[1] renumbered the ZEND_ACC_* flags, and now
ZEND_ACC_IMPLICIT_ABSTRACT_CLASS has the same value as
ZEND_ACC_STATIC.  The former is set, because the class has an
abstract method; if it had not, results would be correct[2].

Dmitry, could you please have a look?

[1] <http://git.php.net/?p=php-src.git;a=commit;h=0fbd2e6a168a5cfacec6c44f4c179879a52428f3>
[2] <https://3v4l.org/qDEpu>
 [2019-12-02 09:53 UTC] abashurov at plesk dot com
Running bisect also points to this commit:
$ git bisect bad
0fbd2e6a168a5cfacec6c44f4c179879a52428f3 is the first bad commit
commit 0fbd2e6a168a5cfacec6c44f4c179879a52428f3
Author: Dmitry Stogov <dmitry@zend.com>
Date:   Tue Sep 11 17:21:17 2018 +0300

    Renumber ZEND_ACC_... flags
 [2019-12-09 10:50 UTC] dmitry@php.net
Automatic comment on behalf of dmitry@zend.com
Revision: http://git.php.net/?p=php-src.git;a=commit;h=42a2fb8411848236d0cd56b5efd05e352e62ee3d
Log: Fixed bug #78895 (Reflection detects abstract non-static class as abstract static. IS_IMPLICIT_ABSTRACT is not longer used)
 [2019-12-09 10:50 UTC] dmitry@php.net
-Status: Verified +Status: Closed
 
PHP Copyright © 2001-2019 The PHP Group
All rights reserved.
Last updated: Thu Dec 12 17:01:24 2019 UTC