theodorejb / polycast
Safely cast values to int, float, or string
Installs: 189 715
Dependents: 1
Suggesters: 0
Security: 0
Stars: 51
Watchers: 5
Forks: 4
Open Issues: 0
Requires (Dev)
- phpunit/phpunit: ^4.8
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
andPHP_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
andPHP_INT_MAX
.
safe_float
- Floats
- Integers
- Strings with an optional positive/negative sign matching the format described at https://php.net/manual/en/language.types.float.php.
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