Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/stevebauman/unfinalize

Remove "final" keywords from classes and methods in vendor packages.
https://github.com/stevebauman/unfinalize

Last synced: 5 days ago
JSON representation

Remove "final" keywords from classes and methods in vendor packages.

Awesome Lists containing this project

README

        

Unfinalize


Unleash the freedom lost with open source PHP packages marking classes and methods as final.






---

Unfinalize uses [PHP CS Fixer](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer) to permanently remove `final` keywords from composer vendor packages:

```diff
- 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](https://github.com/stevebauman/unfinalize/blob/master/builds).

## Installation

```bash
composer require stevebauman/unfinalize
```

## Usage

You may unfinalize files using two different methods: [file paths](#file-paths), or [package paths](#package-paths).

### File Paths

Using files paths allow you to unfinalize specific files or directories by specifying them in the command:

```bash
php vendor/bin/unfinalize run vendor/package/src/File.php
```

You may unfinalize multiple files or directories by separating them by a space:

```bash
php vendor/bin/unfinalize run vendor/package/src/Foo/ vendor/package/src/Bar/File.php
```

To make sure this is always done on your project's dependencies, add the command to your `composer.json` file in the `scripts` property:

```json
{
"scripts": {
"post-update-cmd": [
"@php vendor/bin/unfinalize run vendor/package/src/Foo/ vendor/package/src/Bar/File.php"
]
}
}
```

Then run `composer update`.

### Package Paths

Using package paths allow you to unfinalize entire packages by specifying them in your `composer.json` file.

Add the vendor packages you want to remove the final keywords from inside an `unfinalize` property:

```json
{
"unfinalize": [
"vendor/package"
]
}
```

Add the unfinalize command to your `composer.json` so it runs on `composer update`:

```json
{
"scripts": {
"post-update-cmd": [
"@php vendor/bin/unfinalize run"
]
}
}
```

Then, run `composer update`.

### Options

#### `--annotate={annotation}`

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.

```json
{
"scripts": {
"post-update-cmd": [
"@php vendor/bin/unfinalize run --annotate=internal"
]
}
}
```

Which will produce:

**Before**:

```php
final class Foo
{
final public function bar()
{
// ...
}
}
```

**After**:

```php
/**
* @internal
*/
class Foo
{
/**
* @internal
*/
public function bar()
{
// ...
}
}
```

#### `--properties={protected/public}`

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:

```json
{
"scripts": {
"post-update-cmd": [
"@php vendor/bin/unfinalize run --properties=protected"
]
}
}
```

Which will produce:

**Before**:

```php
class Foo
{
private $bar;
}
```

**After**:

```php
class Foo
{
protected $bar;
}
```

#### `--methods={protected/public}`

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:

```json
{
"scripts": {
"post-update-cmd": [
"@php vendor/bin/unfinalize run --methods=public"
]
}
}
```

Which will produce:

**Before**:

```php
class Foo
{
private function bar()
{
}
}
```

**After**:

```php
class Foo
{
public function bar()
{
}
}
```

#### `--dry`

Execute a dry run to see what files will be modified by Unfinalize:

```bash
vendor/bin/unfinalize run --dry
```