Unleash the freedom lost with open source PHP packages marking classes and methods as final
.
Unfinalize uses PHP CS Fixer to permanently remove final
keywords from composer vendor packages:
- final class Foo
+ class Foo
{
- final public function bar()
+ public function bar()
{
// ...
}
}
- Updates to PHP files are done safely, quickly, and performant.
- Changes are stored permanently. There is no performance impact using Unfinalize.
- No additional dependencies to your application. Unfinalize and its dependencies are compiled into a single phar file.
composer require stevebauman/unfinalize
Inside your composer.json
file, add the vendor packages you want to remove the final keywords from inside:
{
"unfinalize": [
"vendor/package"
]
}
Add the unfinalize command to your composer.json
so it runs on composer update
:
{
"scripts": {
"post-update-cmd": [
"@php vendor/bin/unfinalize run"
]
}
}
Then, run composer update
.
If you would like final classes and methods to be marked with an annotation (@{annotation}
) doc
block after unfinalizing, you may add the --annotate
option to the unfinalize command:
If an annotation already exists in a doc block then it will be left untouched.
{
"scripts": {
"post-update-cmd": [
"@php vendor/bin/unfinalize run --annotate=internal"
]
}
}
Which will produce:
Before:
final class Foo
{
final public function bar()
{
// ...
}
}
After:
/**
* @internal
*/
class Foo
{
/**
* @internal
*/
public function bar()
{
// ...
}
}
If you would like to change the visibility of private
properties to
protected
or public
, you may add the --properties
option to
the unfinalize command with the new visibility to assign:
{
"scripts": {
"post-update-cmd": [
"@php vendor/bin/unfinalize run --properties=protected"
]
}
}
Which will produce:
Before:
class Foo
{
private $bar;
}
After:
class Foo
{
protected $bar;
}
If you would like to change the visibility of private
methods to
protected
or public
, you may add the --methods
option
to the unfinalize command with the new visibility to assign:
{
"scripts": {
"post-update-cmd": [
"@php vendor/bin/unfinalize run --methods=public"
]
}
}
Which will produce:
Before:
class Foo
{
private function bar()
{
}
}
After:
class Foo
{
public function bar()
{
}
}
Execute a dry run to see what files will be modified by Unfinalize:
vendor/bin/unfinalize run --dry