Safely cast values to int, float, or string in PHP
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
lib
tests
.gitattributes
.gitignore
.travis.yml
LICENSE.md
README.md
composer.json
phpunit.xml

README.md

PolyCast

Build Status Packagist Version License

Provides safe_int, safe_float, and safe_string functions. The functions return true if a value can be cast to the designated type without data loss, and false if it cannot.

Three complementary functions are also included: to_int, to_float, and to_string. These functions cast and return a value if the corresponding safe_ function returns true, and throw a CastException if it returns false.

This library was originally based on the Safe Casting Functions RFC proposed (but ultimately declined) for PHP 7. For additional background info see PolyCast: a library for safe type conversion in PHP.

Acceptable casts

safe_int

  • Integers
  • Floats without a remainder between PHP_INT_MIN and PHP_INT_MAX
  • Strings with an optional positive/negative sign, without leading zeros, and containing the digits 0-9 with a value between PHP_INT_MIN and PHP_INT_MAX.

safe_float

safe_string

  • Strings
  • Integers
  • Floats
  • Objects with a __toString method

The safe_ functions will always return false if passed null, true or false, an array, resource, or object (with the exception of objects with a __toString method passed to safe_string).

Install via Composer

composer require theodorejb/polycast

Usage examples

Input validation

use function theodorejb\polycast\{ safe_int, safe_float, safe_string };

if (!safe_string($_POST['name'])) {
    echo 'Name must be a string';
} elseif (!safe_int($_POST['quantity'])) {
    echo 'Quantity must be an integer';
} elseif (!safe_float($_POST['price'])) {
    echo 'Price must be a number';
} else {
    addProduct($_POST['name'], (int)$_POST['quantity'], (float)$_POST['price']);
}

function addProduct(string $name, int $quantity, float $price)
{
    // ... a database query would go here
}

Safe type conversion

use theodorejb\polycast;

try {
    $totalRevenue = 0.0;
    $totalTransactions = 0;

    foreach ($csvRows as $row) {
        $totalRevenue += polycast\to_float($row['monthly_revenue']);
        $totalTransactions += polycast\to_int($row['monthly_transactions']);
    }

    // do something with totals
} catch (polycast\CastException $e) {
    echo "Error: " . $e->getMessage();
    var_dump($e->getTrace());
}

Author

Theodore Brown
http://theodorejb.me

License

MIT