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