1<?php 2 3/* 4 * This file is part of the Symfony package. 5 * 6 * (c) Fabien Potencier <fabien@symfony.com> 7 * 8 * For the full copyright and license information, please view the LICENSE 9 * file that was distributed with this source code. 10 */ 11 12namespace Symfony\Polyfill\Php80; 13 14/** 15 * @author Ion Bazan <ion.bazan@gmail.com> 16 * @author Nico Oelgart <nicoswd@gmail.com> 17 * @author Nicolas Grekas <p@tchwork.com> 18 * 19 * @internal 20 */ 21final class Php80 22{ 23 public static function fdiv(float $dividend, float $divisor): float 24 { 25 return @($dividend / $divisor); 26 } 27 28 public static function get_debug_type($value): string 29 { 30 switch (true) { 31 case null === $value: return 'null'; 32 case \is_bool($value): return 'bool'; 33 case \is_string($value): return 'string'; 34 case \is_array($value): return 'array'; 35 case \is_int($value): return 'int'; 36 case \is_float($value): return 'float'; 37 case \is_object($value): break; 38 case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; 39 default: 40 if (null === $type = @get_resource_type($value)) { 41 return 'unknown'; 42 } 43 44 if ('Unknown' === $type) { 45 $type = 'closed'; 46 } 47 48 return "resource ($type)"; 49 } 50 51 $class = \get_class($value); 52 53 if (false === strpos($class, '@')) { 54 return $class; 55 } 56 57 return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; 58 } 59 60 public static function get_resource_id($res): int 61 { 62 if (!\is_resource($res) && null === @get_resource_type($res)) { 63 throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); 64 } 65 66 return (int) $res; 67 } 68 69 public static function preg_last_error_msg(): string 70 { 71 switch (preg_last_error()) { 72 case \PREG_INTERNAL_ERROR: 73 return 'Internal error'; 74 case \PREG_BAD_UTF8_ERROR: 75 return 'Malformed UTF-8 characters, possibly incorrectly encoded'; 76 case \PREG_BAD_UTF8_OFFSET_ERROR: 77 return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; 78 case \PREG_BACKTRACK_LIMIT_ERROR: 79 return 'Backtrack limit exhausted'; 80 case \PREG_RECURSION_LIMIT_ERROR: 81 return 'Recursion limit exhausted'; 82 case \PREG_JIT_STACKLIMIT_ERROR: 83 return 'JIT stack limit exhausted'; 84 case \PREG_NO_ERROR: 85 return 'No error'; 86 default: 87 return 'Unknown error'; 88 } 89 } 90 91 public static function str_contains(string $haystack, string $needle): bool 92 { 93 return '' === $needle || false !== strpos($haystack, $needle); 94 } 95 96 public static function str_starts_with(string $haystack, string $needle): bool 97 { 98 return 0 === strncmp($haystack, $needle, \strlen($needle)); 99 } 100 101 public static function str_ends_with(string $haystack, string $needle): bool 102 { 103 if ('' === $needle || $needle === $haystack) { 104 return true; 105 } 106 107 if ('' === $haystack) { 108 return false; 109 } 110 111 $needleLength = \strlen($needle); 112 113 return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength); 114 } 115} 116