PackageTrack
Sign in Get early access

dg/bypass-finals

Removes final keyword from source code on-the-fly and allows mocking of final methods and classes

v1.11.0 31M downloads/mo #668 most downloaded on Packagist dg/bypass-finals

What this package is like to depend on

Last release 1 months ago

24 Jul 2026

Release timing varies

gaps range from 1 weeks to 1.4 years

Some releases are documented

notes for 8 of 22 stable releases

Nothing withdrawn

no release was ever pulled

9 years old

22 releases · first in 2017

3 releases in the last 12 months

see the full history below

Release timeline

22 releases · Sep 2017 to Jul 2026
2018 2019 2020 2021 2022 2023 2024 2025 2026
Release Pre-release

Releases

latest 22
  1. v1.11.0 24 Jul 2026
    Release notes

    BypassFinals now understands modern PHP: final disappears not only from classes and methods, but also from properties and property hooks introduced in PHP 8.4. Caching got safer and smarter, path matching finally behaves on Windows, and PHPUnit users can configure path masks straight from phpunit.xml.

    💥PHP 8.2

    • PHP 8.2 is now the minimum. Support for PHP 7.1–8.1 has been dropped. If you're stuck on an older PHP, stay on 1.10.x.

    ✨ New Features

    • final is now removed from properties and property hooks (PHP 8.4+), not just from classes and methods. The rule is inverted: final survives only before constants, where it's a genuine feature rather than a mockability barrier.
    • PHPUnit extension learned allowPaths and denyPaths – restrict which files get rewritten without touching a single line of PHP. Semicolon-separated masks, right there in phpunit.xml:
      <parameter name="allowPaths" value="*/src/*;*/lib/*"/>
      <parameter name="denyPaths" value="*/generated/*"/>
    • debugInfo() now shows the full picture – allowed and denied path rules plus the cache directory, so you can see at a glance why a file wasn't modified.

    🐛 Bug Fixes

    • final readonly int $x no longer produces invalid code. With both bypasses enabled it used to emit a bare int $x; a property must keep at least one modifier, so the first removed one now becomes public.
    • Path masks match case-insensitively on Windows, where C:/Src/ and c:/src/ are the same directory – as they always should have been.
    • Cache files are written atomically via a temp file and rename(), so a process killed mid-write can no longer leave a truncated file behind and poison every subsequent run. [#80]
    • Stale caches invalidate themselves. The cache key now includes the algorithm version and the PHP version, so upgrading PHP or BypassFinals no longer serves you code rewritten by the old rules.
    Open source →
  2. v1.10.2 15 Jun 2026

    Nothing published for this version

  3. v1.10.1 04 Jun 2026
    Release notes

    ✨ New Features

    • bootstrap.php – activate BypassFinals at the earliest possible moment, before vendor/autoload.php loads, so nothing slips through unmodified (#74, #58)

    🐛 Bug Fixes

    • Fixed proc_open() when given a ['file', ...] descriptor spec – the native wrapper no longer chokes on file-based descriptors (#43)
    • Fixed premature EOF: stream_eof() now waits for an actual empty read before reporting end-of-stream, preventing truncated reads (#75, #50)
    • The cache directory is now created recursively, so deeply nested cache paths just work out of the box (#70, #66)
    • Cleared the stat cache after the is_dir() check in stream_open(), fixing stale filesystem state on cache writes (#69, #67)
    • Fixed debugInfo() output so bypass tokens are reported correctly (#68)
    • NativeWrapper::stream_seek() now detects whether the underlying stream is actually seekable instead of blindly seeking (#63)
    • Final-token removal now preserves constant names, so identifiers that happen to look like the final keyword survive untouched (#64)
    • Added a T_READONLY constant polyfill for PHP < 8.1, keeping older runtimes happy (51736af)
    • Consolidated all cache I/O into a single native stream-wrapper cycle, simplifying the read/write path and reducing wrapper churn (#71, #55)
    Open source →
  4. v1.9.0 16 Jan 2025
    Release notes
    • Make PHPUnitExtension configurable (#59)
    • added BypassFinals::debugInfo()
    Open source →
  5. v1.8.0 02 Jul 2024
    Release notes
    • BypassFinals: added allowPaths() & denyPath()
    • PHPUnitExtension: denies path 'vendor/phpunit'
    Open source →
  6. v1.7.0 17 May 2024
    Release notes
    • add settings to cache hash [Closes #53]
    • fixed throwing errors in exists-check functions (#54) [Closes #52]
    • open_stream fail when $path is directory (#56)
    Open source →
  7. v1.6.0 19 Nov 2023
    Release notes
    • added PHPUnitExtension
    • NativeWrapper: implemented stream_set_option()
    • MutatingWrapper has been separated from BypassFinals
    Open source →
  8. v1.5.1 16 Sep 2023
    Release notes

    DG\BypassFinals::enable(bypassReadOnly: false);

    Open source →
  9. v1.5.0 23 Aug 2023
    Release notes
    • removes keyword 'readonly' too [Closes #39]
    Open source →
  10. v1.4.1 13 Sep 2022

    Nothing published for this version

  11. v1.4.0 13 Sep 2022

    Nothing published for this version

  12. v1.3.1 09 Apr 2021

    Nothing published for this version

  13. v1.3.0 15 Oct 2020

    Nothing published for this version

  14. v1.2.2 15 Sep 2020

    Nothing published for this version

  15. v1.2.1 14 May 2020

    Nothing published for this version

  16. v1.2.0 08 May 2020

    Nothing published for this version

  17. v1.1.3 08 May 2020

    Nothing published for this version

  18. v1.1.2 03 Jun 2019

    Nothing published for this version

  19. v1.1.1 15 Jan 2019

    Nothing published for this version

  20. v1.1.0 20 Jul 2018

    Nothing published for this version

  21. v1.0.1 07 Jun 2018

    Nothing published for this version

  22. v1.0 13 Sep 2017

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive