theodorejb/polycast

Safely cast values to int, float, or string

v1.0.0 2015-10-25 19:36 UTC

This package is auto-updated.

Last update: 2024-11-29 04:46:41 UTC


README

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
https://theodorejb.me

License

MIT