PHP code example of hihaho / phpstan-rules

1. Go to this page and download the library: Download hihaho/phpstan-rules library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

hihaho / phpstan-rules example snippets


namespace App\Services;

invade($user)->privateMethod(); // reported

use Route;                            // reported
use Illuminate\Support\Facades\Route; // fine

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Request as RequestFacade;

final class StoreUserController
{
    public function __invoke(Request $request): mixed
    {
        $request->input('name');              // reported (data)
        request('id');                        // reported (helper)
        RequestFacade::boolean('debug');      // reported (facade)

        $request->safe()->string('name');     // fine

        return $request->validate(['name' => '

  // @phpstan-ignore hihaho.validation.noUnsafeRequestData
  $value = $request->input($field->key);
  

namespace App\Services;

$toggle->setActive('name', false);          // reported — name the flag: active: false
$toggle?->setActive('name', false);         // reported
StaticFlag::toggle('name', false);          // reported
new Widget('name', true);                   // reported

$toggle->setActive('name', active: false);  // fine — already named

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

final class Interaction extends Model
{
    protected $with = ['chapters'];  // reported — eager-loads on every query
    protected $with = [];            // fine — explicit empty default is a no-op
}

// Load where actually needed:
Interaction::query()->with('chapters')->get();
$interaction->loadMissing('chapters');

/** @return list<int> */
public function ids(Collection $users): array
{
    return $users->map(fn (User $user): int => $user->id)->values()->all(); // list<int>, no array_values()
}

public function handle(Request $request): void
{
    $video = $request->route('video_id'); // Video — no assert() needed
}

/** @param Builder<User> $query */
public function scopeWithPublishedPosts(Builder $query): void
{
    // $q is Builder<Post> — Post::PUBLISHED resolves instead of erroring against base Model.
    $query->whereHas('posts', fn (Builder $q) => $q->where(Post::STATUS, Post::PUBLISHED));
}

> // Triggers a return.type error (returns the narrowed builder):
> $query->whereHas('posts', fn (Builder $q) => $q->where(Post::STATUS, Post::PUBLISHED));
>
> // Clean — the closure constrains in place and returns nothing:
> $query->whereHas('posts', function (Builder $q): void {
>     $q->where(Post::STATUS, Post::PUBLISHED);
> });
> 
neon
parameters:
    routeFiles:
        - routes/web.php
        - routes/api.php