angelovcom.net

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

cast_to_int.php (2630B)


      1 <?php
      2 /**
      3  * Random_* Compatibility Library
      4  * for using the new PHP 7 random_* API in PHP 5 projects
      5  *
      6  * The MIT License (MIT)
      7  *
      8  * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
      9  *
     10  * Permission is hereby granted, free of charge, to any person obtaining a copy
     11  * of this software and associated documentation files (the "Software"), to deal
     12  * in the Software without restriction, including without limitation the rights
     13  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     14  * copies of the Software, and to permit persons to whom the Software is
     15  * furnished to do so, subject to the following conditions:
     16  *
     17  * The above copyright notice and this permission notice shall be included in
     18  * all copies or substantial portions of the Software.
     19  *
     20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     23  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     25  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     26  * SOFTWARE.
     27  */
     28 
     29 if (!is_callable('RandomCompat_intval')) {
     30     
     31     /**
     32      * Cast to an integer if we can, safely.
     33      * 
     34      * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
     35      * (non-inclusive), it will sanely cast it to an int. If you it's equal to
     36      * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats 
     37      * lose precision, so the <= and => operators might accidentally let a float
     38      * through.
     39      * 
     40      * @param int|float $number    The number we want to convert to an int
     41      * @param bool      $fail_open Set to true to not throw an exception
     42      * 
     43      * @return float|int
     44      * @psalm-suppress InvalidReturnType
     45      *
     46      * @throws TypeError
     47      */
     48     function RandomCompat_intval($number, $fail_open = false)
     49     {
     50         if (is_int($number) || is_float($number)) {
     51             $number += 0;
     52         } elseif (is_numeric($number)) {
     53             $number += 0;
     54         }
     55 
     56         if (
     57             is_float($number)
     58             &&
     59             $number > ~PHP_INT_MAX
     60             &&
     61             $number < PHP_INT_MAX
     62         ) {
     63             $number = (int) $number;
     64         }
     65 
     66         if (is_int($number)) {
     67             return (int) $number;
     68         } elseif (!$fail_open) {
     69             throw new TypeError(
     70                 'Expected an integer.'
     71             );
     72         }
     73         return $number;
     74     }
     75 }