Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

php-standard-library/php-standard-library

Open more actions menu

PSL

PSL - PHP Standard Library

Unit tests status Static analysis status Coding standards status CII Best Practices Coverage Status MSI Total Downloads Latest Stable Version License

A standard library for PHP, inspired by hhvm/hsl. PSL provides a consistent, centralized, well-typed set of APIs covering async, collections, networking, I/O, cryptography, terminal UI, and more - replacing PHP functions and primitives with safer, async-ready alternatives that error predictably.

Documentation · Sponsor

Installation

composer require php-standard-library/php-standard-library

Requires PHP 8.4+.

Quick Look

Type-safe data validation

Validate and coerce untrusted data with composable type combinators - shapes, unions, optionals - all with zero reflection overhead.

use Psl\Type;

$userType = Type\shape([
    'name' => Type\non_empty_string(),
    'age'  => Type\positive_int(),
    'tags' => Type\vec(Type\string()),
]);

$user = $userType->coerce($untrustedInput);
// array{name: non-empty-string, age: positive-int, tags: list<string>}

Structured concurrency

Run concurrent operations with a single function call. Structured concurrency built on fibers - no promises, no callbacks.

use Psl\Async;
use Psl\TCP;
use Psl\IO;

Async\main(static function(): int {
    [$a, $b] = Async\concurrently([
        static fn() => TCP\connect('api.example.com', 443),
        static fn() => TCP\connect('db.example.com', 5432),
    ]);

    IO\write_error_line('Both connections ready');

    return 0;
});

Functional collections

Map, filter, sort, and reshape arrays with pure functions. Separate return types for lists and dicts - no more array key confusion.

use Psl\Vec;
use Psl\Dict;
use Psl\Str;

$names = ['alice', 'bob', 'charlie'];

Vec\map($names, Str\uppercase(...));
// ['ALICE', 'BOB', 'CHARLIE']

Vec\filter($names, fn($n) => Str\length($n) > 3);
// ['alice', 'charlie']

Dict\pull($names, Str\uppercase(...), fn($n) => $n);
// {alice: 'ALICE', bob: 'BOB', charlie: 'CHARLIE'}

TCP server in 10 lines

Production-ready networking primitives. TCP, TLS, UDP, Unix sockets - all async, all composable.

use Psl\Async;
use Psl\TCP;
use Psl\IO;

Async\main(static function(): int {
    $server = TCP\listen('127.0.0.1', 8080);
    IO\write_error_line('Listening on :8080');

    while (true) {
        $conn = $server->accept();
        Async\run(static function() use ($conn) {
            $conn->writeAll("Hello!\n");
            $conn->close();
        })->ignore();
    }
});

Tooling

Tool Description
Mago Enhanced type inference for Mago
Psalm Plugin Enhanced type inference for Psalm
PHPStan Extension Enhanced type inference for PHPStan

Contributing

See CONTRIBUTING.md.

License

MIT - see LICENSE.

Morty Proxy This is a proxified and sanitized view of the page, visit original site.