Go to file
2020-10-07 09:35:06 +01:00
.github run tests on windows 2020-10-07 08:49:09 +02:00
docs Initial commit 2019-12-24 02:01:46 +01:00
src [DataStructure] Introduce the DataStructure component (#53) 2020-10-07 09:35:06 +01:00
tests/Psl [DataStructure] Introduce the DataStructure component (#53) 2020-10-07 09:35:06 +01:00
.coveralls.yml use TravisCI to send code coverage (#79) 2020-10-07 06:25:03 +01:00
.gitattributes add .gitattributes 2020-08-24 22:09:11 +01:00
.gitignore ignore test logs 2020-08-27 15:45:10 +01:00
.phpcs.xml tweak phpcs configurations 2020-09-05 16:29:08 +01:00
.scrutinizer.yml improve type coverage (#24) 2020-07-07 23:10:51 +01:00
.stickler.yml add stickler integration 2019-12-25 20:44:30 +01:00
.travis.yml use vendor/bin/phpunit to run tests instead of composer script 2020-10-07 08:49:09 +02:00
CODE_OF_CONDUCT.md add CODE OF CONDUCT 2020-09-03 12:59:09 +02:00
composer.json use TravisCI to send code coverage (#79) 2020-10-07 06:25:03 +01:00
LICENSE Initial commit 2019-12-24 02:01:46 +01:00
phpunit.xml.dist migrate to phpunit 9 2020-09-01 21:46:28 +01:00
psalm.xml update psalm config 2020-09-01 16:51:23 +01:00
README.md use TravisCI to send code coverage (#79) 2020-10-07 06:25:03 +01:00
SECURITY.md add security policy 2020-09-30 22:22:19 +01:00

Psl - PHP Standard Library

Unit tests status Static analysis status Security analysis status Coding standards status TravisCI Build Status Scrutinizer Build Status Coverage Status Type Coverage SymfonyInsight Scrutinizer Code Quality Code Intelligence Status Total Downloads Latest Stable Version License

Psl is a standard library for PHP, inspired by hhvm/hsl.

The goal of Psl is to provide a consistent, centralized, well-typed set of APIs for PHP programmers.

Example

<?php

declare(strict_types=1);

use Psl\Arr;
use Psl\Str;

/**
 * @psalm-param iterable<?int> $codes
 */
function foo(iterable $codes): string
{
    /** @var list<int> $codes */
    $codes = Arr\filter_nulls($codes);
    /** @var list<string> $chars */
    $chars = Arr\map($codes, fn(int $code): string => Str\chr($code));

    return Str\join($chars, ', ');
}

foo([95, 96, null, 98]);
// 'a, b, d'

Installation

This package doesn't have a stable release yet, but you can still install it using composer :

$ composer require azjezz/psl:dev-develop

Documentation

Documentation is not available yet.

Principles

  • All functions should be typed as strictly as possible
  • The library should be internally consistent
  • References may not be used
  • Arguments should be as general as possible. For example, for array functions, prefer iterable inputs where practical, falling back to array when needed.
  • Return types should be as specific as possible
  • All files should contain declare(strict_types=1);

Consistency Rules

This is not exhaustive list.

  • Functions argument order should be consistent within the library
    • All iterable-related functions take the iterable as the first argument ( e.g. Iter\map and Iter\filter )
    • $haystack, $needle, and $pattern are in the same order for all functions that take them
  • Functions should be consistently named.
  • If an operation can conceivably operate on either keys or values, the default is to operate on the values - the version that operates on keys should have _key suffix (e.g. Iter\last, Iter\last_key, Iter\contains, Iter\contains_key )
  • Find-like operations that can fail should return ?T; a second function should be added with an x suffix that uses an invariant to return T (e.g. Arr\last, Arr\lastx)
  • Iterable functions that do an operation based on a user-supplied keying function for each element should be suffixed with _by (e.g. Arr\sort_by, Iter\group_by, Math\max_by)

Sponsors

Thanks to our sponsors and supporters:

JetBrains

License

The MIT License (MIT). Please see LICENSE for more information.