xref: /plugin/combo/vendor/symfony/polyfill-php80/Php80.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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