refactor: susun semula struktur folder — Laravel source ke src/

This commit is contained in:
Saufi
2026-05-19 15:58:35 +08:00
parent f052251b94
commit bf53c71b45
10806 changed files with 1385379 additions and 121 deletions

19
vendor/symfony/polyfill-php84/LICENSE vendored Normal file
View File

@@ -0,0 +1,19 @@
Copyright (c) 2024-present Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

444
vendor/symfony/polyfill-php84/Php84.php vendored Normal file
View File

@@ -0,0 +1,444 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Polyfill\Php84;
/**
* @author Ayesh Karunaratne <ayesh@aye.sh>
* @author Pierre Ambroise <pierre27.ambroise@gmail.com>
*
* @internal
*/
final class Php84
{
/** @return string|false */
public static function mb_ucfirst(string $string, ?string $encoding = null)
{
if (null === $encoding) {
$encoding = mb_internal_encoding();
}
try {
$validEncoding = @mb_check_encoding('', $encoding);
} catch (\ValueError $e) {
throw new \ValueError(\sprintf('mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given', $encoding));
}
if (!$validEncoding) {
if (80000 > \PHP_VERSION_ID) {
trigger_error(\sprintf('mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given', $encoding), \E_USER_WARNING);
return false;
}
throw new \ValueError(\sprintf('mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given', $encoding));
}
$firstChar = mb_substr($string, 0, 1, $encoding);
$firstChar = mb_convert_case($firstChar, \MB_CASE_TITLE, $encoding);
return $firstChar.mb_substr($string, 1, null, $encoding);
}
/** @return string|false */
public static function mb_lcfirst(string $string, ?string $encoding = null)
{
if (null === $encoding) {
$encoding = mb_internal_encoding();
}
try {
$validEncoding = @mb_check_encoding('', $encoding);
} catch (\ValueError $e) {
throw new \ValueError(\sprintf('mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given', $encoding));
}
if (!$validEncoding) {
if (80000 > \PHP_VERSION_ID) {
trigger_error(\sprintf('mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given', $encoding), \E_USER_WARNING);
return false;
}
throw new \ValueError(\sprintf('mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given', $encoding));
}
$firstChar = mb_substr($string, 0, 1, $encoding);
$firstChar = mb_convert_case($firstChar, \MB_CASE_LOWER, $encoding);
return $firstChar.mb_substr($string, 1, null, $encoding);
}
public static function array_find(array $array, callable $callback)
{
foreach ($array as $key => $value) {
if ($callback($value, $key)) {
return $value;
}
}
return null;
}
public static function array_find_key(array $array, callable $callback)
{
foreach ($array as $key => $value) {
if ($callback($value, $key)) {
return $key;
}
}
return null;
}
public static function array_any(array $array, callable $callback): bool
{
foreach ($array as $key => $value) {
if ($callback($value, $key)) {
return true;
}
}
return false;
}
public static function array_all(array $array, callable $callback): bool
{
foreach ($array as $key => $value) {
if (!$callback($value, $key)) {
return false;
}
}
return true;
}
public static function fpow(float $num, float $exponent): float
{
return $num ** $exponent;
}
/** @return string|false */
public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null)
{
return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__);
}
/** @return string|false */
public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null)
{
return self::mb_internal_trim('{^[%s]+}Du', $string, $characters, $encoding, __FUNCTION__);
}
/** @return string|false */
public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null)
{
return self::mb_internal_trim('{[%s]+$}D', $string, $characters, $encoding, __FUNCTION__);
}
/** @return string|false */
private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function)
{
if (null === $encoding) {
$encoding = mb_internal_encoding();
}
try {
$validEncoding = @mb_check_encoding('', $encoding);
} catch (\ValueError $e) {
throw new \ValueError(\sprintf('%s(): Argument #3 ($encoding) must be a valid encoding, "%s" given', $function, $encoding));
}
if (!$validEncoding) {
if (80000 > \PHP_VERSION_ID) {
trigger_error(\sprintf('%s(): Argument #3 ($encoding) must be a valid encoding, "%s" given', $function, $encoding), \E_USER_WARNING);
return false;
}
throw new \ValueError(\sprintf('%s(): Argument #3 ($encoding) must be a valid encoding, "%s" given', $function, $encoding));
}
if ('' === $characters) {
return null === $encoding ? $string : mb_convert_encoding($string, $encoding);
}
if ('UTF-8' === $encoding || \in_array(strtolower($encoding), ['utf-8', 'utf8'], true)) {
$encoding = 'UTF-8';
}
$string = mb_convert_encoding($string, 'UTF-8', $encoding);
if (null !== $characters) {
$characters = mb_convert_encoding($characters, 'UTF-8', $encoding);
}
if (null === $characters) {
$characters = "\\0 \f\n\r\t\v\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}";
} else {
$characters = preg_quote($characters);
}
$string = preg_replace(\sprintf($regex, $characters), '', $string);
if ('UTF-8' === $encoding) {
return $string;
}
return mb_convert_encoding($string, $encoding, 'UTF-8');
}
public static function grapheme_str_split(string $string, int $length)
{
if (0 > $length || 1073741823 < $length) {
throw new \ValueError('grapheme_str_split(): Argument #2 ($length) must be greater than 0 and less than or equal to 1073741823.');
}
if ('' === $string) {
return [];
}
$regex = ((float) \PCRE_VERSION < 10 ? (float) \PCRE_VERSION >= 8.32 : (float) \PCRE_VERSION >= 10.39)
? '\X'
: '(?:\r\n|(?:[ -~\x{200C}\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-]+|[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}])[\p{Mn}\p{Me}\x{09BE}\x{09D7}\x{0B3E}\x{0B57}\x{0BBE}\x{0BD7}\x{0CC2}\x{0CD5}\x{0CD6}\x{0D3E}\x{0D57}\x{0DCF}\x{0DDF}\x{200C}\x{200D}\x{1D165}\x{1D16E}-\x{1D172}]*|[\p{Cc}\p{Cf}\p{Zl}\p{Zp}])';
if (!preg_match_all('/'.$regex.'/u', $string, $matches)) {
return false;
}
if (1 === $length) {
return $matches[0];
}
$chunks = array_chunk($matches[0], $length);
foreach ($chunks as &$chunk) {
$chunk = implode('', $chunk);
}
return $chunks;
}
public static function bcceil(string $num): string
{
if (!is_numeric($num)) {
throw new \ValueError('bcceil(): Argument #1 ($num) is not well-formed');
}
return self::bcround($num, 0, \RoundingMode::PositiveInfinity);
}
public static function bcdivmod(string $num1, string $num2, ?int $scale = null): ?array
{
if (null === $quot = @bcdiv($num1, $num2, 0)) {
throw new \DivisionByZeroError('Division by zero');
}
$scale = $scale ?? (\PHP_VERSION_ID >= 70300 ? bcscale() : (\ini_get('bcmath.scale') ?: 0));
return [$quot, bcmod($num1, $num2, $scale)];
}
public static function bcfloor(string $num): string
{
if (!is_numeric($num)) {
throw new \ValueError('bcfloor(): Argument #1 ($num) is not well-formed');
}
return self::bcround($num, 0, \RoundingMode::NegativeInfinity);
}
/**
* @param \RoundingMode|\RoundingMode::* $mode
*/
public static function bcround(string $num, int $precision = 0, $mode = \RoundingMode::HalfAwayFromZero): string
{
if (!is_numeric($num)) {
throw new \ValueError('bcround(): Argument #1 ($num) is not well-formed');
}
$sign = 1;
if ('' !== $num && ('-' === $num[0] || '+' === $num[0])) {
if ('-' === $num[0]) {
$sign = -1;
}
$num = substr($num, 1);
}
if (false !== strpos($num, '.')) {
[$intPart, $fracPart] = array_pad(explode('.', $num, 2), 2, '');
} else {
$intPart = $num;
$fracPart = '';
}
if ('' === $intPart) {
$intPart = '0';
}
$intPart = self::trimLeadingZeros($intPart);
$fracPart = (string) $fracPart;
if ($precision >= 0) {
$fracLength = \strlen($fracPart);
if ($precision <= $fracLength) {
$scaledInt = $intPart.(string) substr($fracPart, 0, $precision);
$scaledFrac = (string) substr($fracPart, $precision);
} else {
$scaledInt = $intPart.$fracPart.str_repeat('0', $precision - $fracLength);
$scaledFrac = '';
}
} else {
$shift = -$precision;
$intLength = \strlen($intPart);
if ($shift <= $intLength) {
$splitPos = $intLength - $shift;
$scaledInt = substr($intPart, 0, $splitPos);
$scaledInt = '' === $scaledInt ? '0' : $scaledInt;
$scaledFrac = substr($intPart, $splitPos).$fracPart;
} else {
$scaledInt = '0';
$scaledFrac = str_repeat('0', $shift - $intLength).$intPart.$fracPart;
}
}
$roundedInt = self::roundIntegerPart($scaledInt, $scaledFrac, $sign, $mode);
$isZero = '' === trim($roundedInt, '0');
$absResult = self::formatRoundedDigits($roundedInt, $precision);
if (-1 === $sign && !$isZero) {
$absResult = '-'.$absResult;
}
return $absResult;
}
private static function roundIntegerPart(string $intPart, string $fracPart, int $sign, $mode): string
{
$intPart = self::trimLeadingZeros($intPart);
if ('' === $fracPart || '' === trim($fracPart, '0')) {
return $intPart;
}
$firstDigit = $fracPart[0];
$tail = (string) substr($fracPart, 1);
$tailNonZero = '' !== trim($tail, '0');
$isGreaterThanHalf = $firstDigit > '5' || ('5' === $firstDigit && $tailNonZero);
$isExactlyHalf = '5' === $firstDigit && !$tailNonZero;
$shouldIncrease = false;
switch ($mode) {
case \RoundingMode::TowardsZero:
break;
case \RoundingMode::AwayFromZero:
$shouldIncrease = true;
break;
case \RoundingMode::PositiveInfinity:
$shouldIncrease = $sign > 0;
break;
case \RoundingMode::NegativeInfinity:
$shouldIncrease = $sign < 0;
break;
case \RoundingMode::HalfAwayFromZero:
$shouldIncrease = $isGreaterThanHalf || $isExactlyHalf;
break;
case \RoundingMode::HalfTowardsZero:
$shouldIncrease = $isGreaterThanHalf;
break;
case \RoundingMode::HalfEven:
if ($isGreaterThanHalf) {
$shouldIncrease = true;
} elseif ($isExactlyHalf && 1 === self::lastDigit($intPart) % 2) {
$shouldIncrease = true;
}
break;
case \RoundingMode::HalfOdd:
if ($isGreaterThanHalf) {
$shouldIncrease = true;
} elseif ($isExactlyHalf && 0 === self::lastDigit($intPart) % 2) {
$shouldIncrease = true;
}
break;
}
if ($shouldIncrease) {
$intPart = self::incrementDigits($intPart);
}
return self::trimLeadingZeros($intPart);
}
private static function formatRoundedDigits(string $roundedInt, int $precision): string
{
if ($precision > 0) {
if (\strlen($roundedInt) <= $precision) {
$roundedInt = str_pad($roundedInt, $precision + 1, '0', \STR_PAD_LEFT);
}
$intDigits = substr($roundedInt, 0, -$precision);
$fracDigits = substr($roundedInt, -$precision);
$intDigits = self::trimLeadingZeros('' === $intDigits ? '0' : $intDigits);
$fracDigits = str_pad($fracDigits, $precision, '0', \STR_PAD_LEFT);
return $intDigits.'.'.$fracDigits;
}
if (0 === $precision) {
return self::trimLeadingZeros($roundedInt);
}
$shift = -$precision;
$digits = $roundedInt.str_repeat('0', $shift);
return self::trimLeadingZeros($digits);
}
private static function incrementDigits(string $digits): string
{
$digits = '' === $digits ? '0' : $digits;
$index = \strlen($digits) - 1;
$result = $digits;
$carry = 1;
while ($index >= 0 && $carry) {
$value = \ord($result[$index]) - 48 + $carry;
$carry = $value >= 10 ? 1 : 0;
$result[$index] = \chr(48 + ($value % 10));
--$index;
}
return $carry ? '1'.$result : $result;
}
private static function trimLeadingZeros(string $digits): string
{
$digits = ltrim($digits, '0');
return '' === $digits ? '0' : $digits;
}
private static function lastDigit(string $digits): int
{
$length = \strlen($digits);
return $length ? \ord($digits[$length - 1]) - 48 : 0;
}
}

23
vendor/symfony/polyfill-php84/README.md vendored Normal file
View File

@@ -0,0 +1,23 @@
Symfony Polyfill / Php84
========================
This component provides features added to PHP 8.4 core:
- [`array_find`, `array_find_key`, `array_any` and `array_all`](https://wiki.php.net/rfc/array_find)
- [`bcdivmod`](https://wiki.php.net/rfc/add_bcdivmod_to_bcmath)
- [`Deprecated`](https://wiki.php.net/rfc/deprecated_attribute)
- `CURL_HTTP_VERSION_3` and `CURL_HTTP_VERSION_3ONLY` constants
- [`fpow`](https://wiki.php.net/rfc/raising_zero_to_power_of_negative_number)
- [`grapheme_str_split`](https://wiki.php.net/rfc/grapheme_str_split)
- [`mb_trim`, `mb_ltrim` and `mb_rtrim`](https://wiki.php.net/rfc/mb_trim)
- [`mb_ucfirst` and `mb_lcfirst`](https://wiki.php.net/rfc/mb_ucfirst)
- [`PDO` driver specific sub-classes](https://wiki.php.net/rfc/pdo_driver_specific_subclasses)
- [`ReflectionConstant`](https://github.com/php/php-src/pull/13669)
More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).
License
=======
This library is released under the [MIT license](LICENSE).

View File

@@ -0,0 +1,25 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
if (\PHP_VERSION_ID < 80400) {
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::TARGET_CLASS_CONSTANT)]
final class Deprecated
{
public readonly ?string $message;
public readonly ?string $since;
public function __construct(?string $message = null, ?string $since = null)
{
$this->message = $message;
$this->since = $since;
}
}
}

View File

@@ -0,0 +1,24 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
if (\PHP_VERSION_ID < 80400) {
enum RoundingMode
{
case HalfAwayFromZero;
case HalfTowardsZero;
case HalfEven;
case HalfOdd;
case TowardsZero;
case AwayFromZero;
case NegativeInfinity;
case PositiveInfinity;
}
}

View File

@@ -0,0 +1,34 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
if (\PHP_VERSION_ID < 80100) {
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::TARGET_CLASS_CONSTANT)]
final class Deprecated
{
/**
* @readonly
*/
public ?string $message;
/**
* @readonly
*/
public ?string $since;
public function __construct(?string $message = null, ?string $since = null)
{
$this->message = $message;
$this->since = $since;
}
}
} elseif (\PHP_VERSION_ID < 80400) {
require dirname(__DIR__).'/Deprecated.php';
}

View File

@@ -0,0 +1,43 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Pdo;
if (\PHP_VERSION_ID < 80400 && \extension_loaded('pdo_dblib')) {
class Dblib extends \PDO
{
public const ATTR_CONNECTION_TIMEOUT = \PDO::DBLIB_ATTR_CONNECTION_TIMEOUT;
public const ATTR_QUERY_TIMEOUT = \PDO::DBLIB_ATTR_QUERY_TIMEOUT;
public const ATTR_STRINGIFY_UNIQUEIDENTIFIER = \PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER;
public const ATTR_VERSION = \PDO::DBLIB_ATTR_VERSION;
public const ATTR_TDS_VERSION = \PHP_VERSION_ID >= 70300 ? \PDO::DBLIB_ATTR_TDS_VERSION : 1004;
public const ATTR_SKIP_EMPTY_ROWSETS = \PHP_VERSION_ID >= 70300 ? \PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS : 1005;
public const ATTR_DATETIME_CONVERT = \PHP_VERSION_ID >= 70300 ? \PDO::DBLIB_ATTR_DATETIME_CONVERT : 1006;
public function __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
{
parent::__construct($dsn, $username, $password, $options);
if ('dblib' !== $driver = $this->getAttribute(\PDO::ATTR_DRIVER_NAME)) {
throw new \PDOException(\sprintf('Pdo\Dblib::__construct() cannot be used for connecting to the "%s" driver', $driver));
}
}
public static function connect(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null): self
{
try {
return new self($dsn, $username, $password, $options);
} catch (\PDOException $e) {
throw preg_match('/^Pdo\\\\Dblib::__construct\(\) cannot be used for connecting to the "([a-z]+)" driver/', $e->getMessage(), $matches) ? new \PDOException(\sprintf('Pdo\Dblib::connect() cannot be used for connecting to the "%s" driver', $matches[1])) : $e;
}
}
}
}

View File

@@ -0,0 +1,39 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Pdo;
if (\PHP_VERSION_ID < 80400 && \extension_loaded('pdo_firebird')) {
class Firebird extends \PDO
{
public const ATTR_DATE_FORMAT = \PDO::FB_ATTR_DATE_FORMAT;
public const ATTR_TIME_FORMAT = \PDO::FB_ATTR_TIME_FORMAT;
public const ATTR_TIMESTAMP_FORMAT = \PDO::FB_ATTR_TIMESTAMP_FORMAT;
public function __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
{
parent::__construct($dsn, $username, $password, $options);
if ('firebird' !== $driver = $this->getAttribute(\PDO::ATTR_DRIVER_NAME)) {
throw new \PDOException(\sprintf('Pdo\Firebird::__construct() cannot be used for connecting to the "%s" driver', $driver));
}
}
public static function connect(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null): self
{
try {
return new self($dsn, $username, $password, $options);
} catch (\PDOException $e) {
throw preg_match('/^Pdo\\\\Firebird::__construct\(\) cannot be used for connecting to the "([a-z]+)" driver/', $e->getMessage(), $matches) ? new \PDOException(\sprintf('Pdo\Firebird::connect() cannot be used for connecting to the "%s" driver', $matches[1])) : $e;
}
}
}
}

View File

@@ -0,0 +1,101 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Pdo;
use PDO;
if (\PHP_VERSION_ID < 80400 && \extension_loaded('pdo_mysql')) {
// Feature detection for non-mysqlnd; see also https://www.php.net/manual/en/class.pdo-mysql.php#pdo-mysql.constants.attr-max-buffer-size
if (\defined('PDO::MYSQL_ATTR_MAX_BUFFER_SIZE') && \defined('PDO::MYSQL_ATTR_READ_DEFAULT_FILE') && \defined('PDO::MYSQL_ATTR_READ_DEFAULT_GROUP')) {
class Mysql extends \PDO
{
public const ATTR_COMPRESS = \PDO::MYSQL_ATTR_COMPRESS;
public const ATTR_DIRECT_QUERY = \PDO::MYSQL_ATTR_DIRECT_QUERY;
public const ATTR_FOUND_ROWS = \PDO::MYSQL_ATTR_FOUND_ROWS;
public const ATTR_IGNORE_SPACE = \PDO::MYSQL_ATTR_IGNORE_SPACE;
public const ATTR_INIT_COMMAND = \PDO::MYSQL_ATTR_INIT_COMMAND;
public const ATTR_LOCAL_INFILE = \PDO::MYSQL_ATTR_LOCAL_INFILE;
public const ATTR_LOCAL_INFILE_DIRECTORY = \PHP_VERSION_ID >= 80100 ? \PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY : 1015;
public const ATTR_MAX_BUFFER_SIZE = \PDO::MYSQL_ATTR_MAX_BUFFER_SIZE;
public const ATTR_MULTI_STATEMENTS = \PDO::MYSQL_ATTR_MULTI_STATEMENTS;
public const ATTR_READ_DEFAULT_FILE = \PDO::MYSQL_ATTR_READ_DEFAULT_FILE;
public const ATTR_READ_DEFAULT_GROUP = \PDO::MYSQL_ATTR_READ_DEFAULT_GROUP;
public const ATTR_SERVER_PUBLIC_KEY = \PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY;
public const ATTR_SSL_CA = \PDO::MYSQL_ATTR_SSL_CA;
public const ATTR_SSL_CAPATH = \PDO::MYSQL_ATTR_SSL_CAPATH;
public const ATTR_SSL_CERT = \PDO::MYSQL_ATTR_SSL_CERT;
public const ATTR_SSL_CIPHER = \PDO::MYSQL_ATTR_SSL_CIPHER;
public const ATTR_SSL_KEY = \PDO::MYSQL_ATTR_SSL_KEY;
public const ATTR_SSL_VERIFY_SERVER_CERT = \PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT;
public const ATTR_USE_BUFFERED_QUERY = \PDO::MYSQL_ATTR_USE_BUFFERED_QUERY;
public function __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
{
parent::__construct($dsn, $username, $password, $options);
if ('mysql' !== $driver = $this->getAttribute(\PDO::ATTR_DRIVER_NAME)) {
throw new \PDOException(\sprintf('Pdo\Mysql::__construct() cannot be used for connecting to the "%s" driver', $driver));
}
}
public static function connect(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null): self
{
try {
return new self($dsn, $username, $password, $options);
} catch (\PDOException $e) {
throw preg_match('/^Pdo\\\\Mysql::__construct\(\) cannot be used for connecting to the "([a-z]+)" driver/', $e->getMessage(), $matches) ? new \PDOException(\sprintf('Pdo\Mysql::connect() cannot be used for connecting to the "%s" driver', $matches[1])) : $e;
}
}
}
} else {
class Mysql extends \PDO
{
public const ATTR_COMPRESS = \PDO::MYSQL_ATTR_COMPRESS;
public const ATTR_DIRECT_QUERY = \PDO::MYSQL_ATTR_DIRECT_QUERY;
public const ATTR_FOUND_ROWS = \PDO::MYSQL_ATTR_FOUND_ROWS;
public const ATTR_IGNORE_SPACE = \PDO::MYSQL_ATTR_IGNORE_SPACE;
public const ATTR_INIT_COMMAND = \PDO::MYSQL_ATTR_INIT_COMMAND;
public const ATTR_LOCAL_INFILE = \PDO::MYSQL_ATTR_LOCAL_INFILE;
public const ATTR_LOCAL_INFILE_DIRECTORY = \PHP_VERSION_ID >= 80100 ? \PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY : 1015;
// public const ATTR_MAX_BUFFER_SIZE = PDO::MYSQL_ATTR_MAX_BUFFER_SIZE; // disabled for mysqlnd
public const ATTR_MULTI_STATEMENTS = \PDO::MYSQL_ATTR_MULTI_STATEMENTS;
// public const ATTR_READ_DEFAULT_FILE = PDO::MYSQL_ATTR_READ_DEFAULT_FILE; // disabled for mysqlnd
// public const ATTR_READ_DEFAULT_GROUP = PDO::MYSQL_ATTR_READ_DEFAULT_GROUP; // disabled for mysqlnd
public const ATTR_SERVER_PUBLIC_KEY = \PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY;
public const ATTR_SSL_CA = \PDO::MYSQL_ATTR_SSL_CA;
public const ATTR_SSL_CAPATH = \PDO::MYSQL_ATTR_SSL_CAPATH;
public const ATTR_SSL_CERT = \PDO::MYSQL_ATTR_SSL_CERT;
public const ATTR_SSL_CIPHER = \PDO::MYSQL_ATTR_SSL_CIPHER;
public const ATTR_SSL_KEY = \PDO::MYSQL_ATTR_SSL_KEY;
public const ATTR_SSL_VERIFY_SERVER_CERT = \PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT;
public const ATTR_USE_BUFFERED_QUERY = \PDO::MYSQL_ATTR_USE_BUFFERED_QUERY;
public function __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
{
parent::__construct($dsn, $username, $password, $options);
if ('mysql' !== $driver = $this->getAttribute(\PDO::ATTR_DRIVER_NAME)) {
throw new \PDOException(\sprintf('Pdo\Mysql::__construct() cannot be used for connecting to the "%s" driver', $driver));
}
}
public static function connect(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null): self
{
try {
return new self($dsn, $username, $password, $options);
} catch (\PDOException $e) {
throw preg_match('/^Pdo\\\\Mysql::__construct\(\) cannot be used for connecting to the "([a-z]+)" driver/', $e->getMessage(), $matches) ? new \PDOException(\sprintf('Pdo\Mysql::connect() cannot be used for connecting to the "%s" driver', $matches[1])) : $e;
}
}
}
}
}

View File

@@ -0,0 +1,41 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Pdo;
if (\PHP_VERSION_ID < 80400 && \extension_loaded('pdo_odbc')) {
class Odbc extends \PDO
{
public const ATTR_USE_CURSOR_LIBRARY = \PDO::ODBC_ATTR_USE_CURSOR_LIBRARY;
public const ATTR_ASSUME_UTF8 = \PDO::ODBC_ATTR_ASSUME_UTF8;
public const SQL_USE_IF_NEEDED = \PDO::ODBC_SQL_USE_IF_NEEDED;
public const SQL_USE_DRIVER = \PDO::ODBC_SQL_USE_DRIVER;
public const SQL_USE_ODBC = \PDO::ODBC_SQL_USE_ODBC;
public function __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
{
parent::__construct($dsn, $username, $password, $options);
if ('odbc' !== $driver = $this->getAttribute(\PDO::ATTR_DRIVER_NAME)) {
throw new \PDOException(\sprintf('Pdo\Odbc::__construct() cannot be used for connecting to the "%s" driver', $driver));
}
}
public static function connect(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null): self
{
try {
return new self($dsn, $username, $password, $options);
} catch (\PDOException $e) {
throw preg_match('/^Pdo\\\\Odbc::__construct\(\) cannot be used for connecting to the "([a-z]+)" driver/', $e->getMessage(), $matches) ? new \PDOException(\sprintf('Pdo\Odbc::connect() cannot be used for connecting to the "%s" driver', $matches[1])) : $e;
}
}
}
}

View File

@@ -0,0 +1,94 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Pdo;
if (\PHP_VERSION_ID < 80400 && \extension_loaded('pdo_pgsql')) {
class Pgsql extends \PDO
{
public const ATTR_DISABLE_PREPARES = \PDO::PGSQL_ATTR_DISABLE_PREPARES;
public function __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
{
parent::__construct($dsn, $username, $password, $options);
if ('pgsql' !== $driver = $this->getAttribute(\PDO::ATTR_DRIVER_NAME)) {
throw new \PDOException(\sprintf('Pdo\Pgsql::__construct() cannot be used for connecting to the "%s" driver', $driver));
}
}
public static function connect(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null): self
{
try {
return new self($dsn, $username, $password, $options);
} catch (\PDOException $e) {
throw preg_match('/^Pdo\\\\Pgsql::__construct\(\) cannot be used for connecting to the "([a-z]+)" driver/', $e->getMessage(), $matches) ? new \PDOException(\sprintf('Pdo\Pgsql::connect() cannot be used for connecting to the "%s" driver', $matches[1])) : $e;
}
}
public function copyFromArray(string $tableName, array $rows, string $separator = "\t", string $nullAs = '\\\\N', ?string $fields = null): bool
{
return $this->pgsqlCopyFromArray($tableName, $rows, $separator, $nullAs, $fields);
}
public function copyFromFile(string $tableName, string $filename, string $separator = "\t", string $nullAs = '\\\\N', ?string $fields = null): bool
{
return $this->pgsqlCopyFromFile($tableName, $filename, $separator, $nullAs, $fields);
}
/**
* @return array|false
*/
public function copyToArray(string $tableName, string $separator = "\t", string $nullAs = '\\\\N', ?string $fields = null)
{
return $this->pgsqlCopyToArray($tableName, $separator, $nullAs, $fields);
}
public function copyToFile(string $tableName, string $filename, string $separator = "\t", string $nullAs = '\\\\N', ?string $fields = null): bool
{
return $this->pgsqlCopyToFile($tableName, $filename, $separator, $nullAs, $fields);
}
/**
* @return array|false
*/
public function getNotify(int $fetchMode = \PDO::FETCH_DEFAULT, int $timeoutMilliseconds = 0)
{
return $this->pgsqlGetNotify($fetchMode, $timeoutMilliseconds);
}
public function getPid(): int
{
return $this->pgsqlGetPid();
}
/**
* @return string|false
*/
public function lobCreate()
{
return $this->pgsqlLOBCreate();
}
/**
* @return resource|false
*/
public function lobOpen(string $oid, string $mode = 'rb')
{
return $this->pgsqlLOBOpen($oid, $mode);
}
public function lobUnlink(string $oid): bool
{
return $this->pgsqlLOBUnlink($oid);
}
}
}

View File

@@ -0,0 +1,58 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Pdo;
if (\PHP_VERSION_ID < 80400 && \extension_loaded('pdo_sqlite')) {
class Sqlite extends \PDO
{
public const ATTR_EXTENDED_RESULT_CODES = \PHP_VERSION_ID >= 70400 ? \PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES : 1002;
public const ATTR_OPEN_FLAGS = \PHP_VERSION_ID >= 70300 ? \PDO::SQLITE_ATTR_OPEN_FLAGS : 1000;
public const ATTR_READONLY_STATEMENT = \PHP_VERSION_ID >= 70400 ? \PDO::SQLITE_ATTR_READONLY_STATEMENT : 1001;
public const DETERMINISTIC = \PDO::SQLITE_DETERMINISTIC;
public const OPEN_READONLY = \PHP_VERSION_ID >= 70300 ? \PDO::SQLITE_OPEN_READONLY : 1;
public const OPEN_READWRITE = \PHP_VERSION_ID >= 70300 ? \PDO::SQLITE_OPEN_READWRITE : 2;
public const OPEN_CREATE = \PHP_VERSION_ID >= 70300 ? \PDO::SQLITE_OPEN_CREATE : 4;
public function __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
{
parent::__construct($dsn, $username, $password, $options);
if ('sqlite' !== $driver = $this->getAttribute(\PDO::ATTR_DRIVER_NAME)) {
throw new \PDOException(\sprintf('Pdo\Sqlite::__construct() cannot be used for connecting to the "%s" driver', $driver));
}
}
public static function connect(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null): self
{
try {
return new self($dsn, $username, $password, $options);
} catch (\PDOException $e) {
throw preg_match('/^Pdo\\\\Sqlite::__construct\(\) cannot be used for connecting to the "([a-z]+)" driver/', $e->getMessage(), $matches) ? new \PDOException(\sprintf('Pdo\Sqlite::connect() cannot be used for connecting to the "%s" driver', $matches[1])) : $e;
}
}
public function createAggregate(string $name, callable $step, callable $finalize, int $numArgs = -1): bool
{
return $this->sqliteCreateAggregate($name, $step, $finalize, $numArgs);
}
public function createCollation(string $name, callable $callback): bool
{
return $this->sqliteCreateCollation($name, $callback);
}
public function createFunction(string $function_name, callable $callback, int $num_args = -1, int $flags = 0): bool
{
return $this->sqliteCreateFunction($function_name, $callback, $num_args, $flags);
}
}
}

View File

@@ -0,0 +1,156 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
if (\PHP_VERSION_ID < 80400) {
// @author Daniel Scherzer <daniel.e.scherzer@gmail.com>
final class ReflectionConstant
{
/**
* @var string
*
* @readonly
*/
public $name;
private $value;
private $deprecated;
private static $persistentConstants = [];
public function __construct(string $name)
{
if (!defined($name) || false !== strpos($name, '::')) {
throw new ReflectionException("Constant \"$name\" does not exist");
}
$this->name = ltrim($name, '\\');
$deprecated = false;
$eh = set_error_handler(static function ($type, $msg, $file, $line) use ($name, &$deprecated, &$eh) {
if (\E_DEPRECATED === $type && "Constant $name is deprecated" === $msg) {
return $deprecated = true;
}
return $eh && $eh($type, $msg, $file, $line);
});
try {
$this->value = constant($name);
$this->deprecated = $deprecated;
} finally {
restore_error_handler();
}
}
public function getName(): string
{
return $this->name;
}
public function getValue()
{
return $this->value;
}
public function getNamespaceName(): string
{
if (false === $slashPos = strrpos($this->name, '\\')) {
return '';
}
return substr($this->name, 0, $slashPos);
}
public function getShortName(): string
{
if (false === $slashPos = strrpos($this->name, '\\')) {
return $this->name;
}
return substr($this->name, $slashPos + 1);
}
public function isDeprecated(): bool
{
return $this->deprecated;
}
public function __toString(): string
{
// A constant is persistent if provided by PHP itself rather than
// being defined by users. If we got here, we know that it *is*
// defined, so we just need to figure out if it is defined by the
// user or not
if (!self::$persistentConstants) {
$persistentConstants = get_defined_constants(true);
unset($persistentConstants['user']);
foreach ($persistentConstants as $constants) {
self::$persistentConstants += $constants;
}
}
$persistent = array_key_exists($this->name, self::$persistentConstants);
// Can't match the inclusion of `no_file_cache` but the rest is
// possible to match
$result = 'Constant [ ';
if ($persistent || $this->deprecated) {
$result .= '<';
if ($persistent) {
$result .= 'persistent';
if ($this->deprecated) {
$result .= ', ';
}
}
if ($this->deprecated) {
$result .= 'deprecated';
}
$result .= '> ';
}
// Cannot just use gettype() to match zend_zval_type_name()
if (is_object($this->value)) {
$result .= \PHP_VERSION_ID >= 80000 ? get_debug_type($this->value) : gettype($this->value);
} elseif (is_bool($this->value)) {
$result .= 'bool';
} elseif (is_int($this->value)) {
$result .= 'int';
} elseif (is_float($this->value)) {
$result .= 'float';
} elseif (null === $this->value) {
$result .= 'null';
} else {
$result .= gettype($this->value);
}
$result .= ' ';
$result .= $this->name;
$result .= ' ] { ';
if (is_array($this->value)) {
$result .= 'Array';
} else {
// This will throw an exception if the value is an object that
// cannot be converted to string; that is expected and matches
// the behavior of zval_get_string_func()
$result .= (string) $this->value;
}
$result .= " }\n";
return $result;
}
public function __sleep(): array
{
throw new Exception("Serialization of 'ReflectionConstant' is not allowed");
}
public function __wakeup(): void
{
throw new Exception("Unserialization of 'ReflectionConstant' is not allowed");
}
}
}

View File

@@ -0,0 +1,44 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
if (\PHP_VERSION_ID < 80100) {
final class RoundingMode
{
const HalfAwayFromZero = 0;
const HalfTowardsZero = 1;
const HalfEven = 2;
const HalfOdd = 3;
const TowardsZero = 4;
const AwayFromZero = 5;
const NegativeInfinity = 6;
const PositiveInfinity = 7;
private function __construct()
{
}
public static function cases(): array
{
return [
self::HalfAwayFromZero,
self::HalfTowardsZero,
self::HalfEven,
self::HalfOdd,
self::TowardsZero,
self::AwayFromZero,
self::NegativeInfinity,
self::PositiveInfinity,
];
}
}
} elseif (\PHP_VERSION_ID < 80400) {
require dirname(__DIR__).'/RoundingMode.php';
}

View File

@@ -0,0 +1,91 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Symfony\Polyfill\Php84 as p;
if (\PHP_VERSION_ID >= 80400) {
return;
}
if (defined('CURL_VERSION_HTTP3') || \PHP_VERSION_ID < 80200 && function_exists('curl_version') && curl_version()['version'] >= 0x074200) { // libcurl >= 7.66.0
if (!defined('CURL_HTTP_VERSION_3')) {
define('CURL_HTTP_VERSION_3', 30);
}
if (!defined('CURL_HTTP_VERSION_3ONLY') && defined('CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256')) { // libcurl >= 7.80.0 (7.88 would be better but is slow to check)
define('CURL_HTTP_VERSION_3ONLY', 31);
}
}
if (!function_exists('array_find')) {
function array_find(array $array, callable $callback) { return p\Php84::array_find($array, $callback); }
}
if (!function_exists('array_find_key')) {
function array_find_key(array $array, callable $callback) { return p\Php84::array_find_key($array, $callback); }
}
if (!function_exists('array_any')) {
function array_any(array $array, callable $callback): bool { return p\Php84::array_any($array, $callback); }
}
if (!function_exists('array_all')) {
function array_all(array $array, callable $callback): bool { return p\Php84::array_all($array, $callback); }
}
if (!function_exists('fpow')) {
function fpow(float $num, float $exponent): float { return p\Php84::fpow($num, $exponent); }
}
if (\PHP_VERSION_ID >= 80000) {
return require __DIR__.'/bootstrap80.php';
}
if (extension_loaded('mbstring')) {
if (!function_exists('mb_ucfirst')) {
function mb_ucfirst(string $string, ?string $encoding = null) { return p\Php84::mb_ucfirst($string, $encoding); }
}
if (!function_exists('mb_lcfirst')) {
function mb_lcfirst(string $string, ?string $encoding = null) { return p\Php84::mb_lcfirst($string, $encoding); }
}
if (!function_exists('mb_trim')) {
function mb_trim(string $string, ?string $characters = null, ?string $encoding = null) { return p\Php84::mb_trim($string, $characters, $encoding); }
}
if (!function_exists('mb_ltrim')) {
function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null) { return p\Php84::mb_ltrim($string, $characters, $encoding); }
}
if (!function_exists('mb_rtrim')) {
function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null) { return p\Php84::mb_rtrim($string, $characters, $encoding); }
}
}
if (extension_loaded('bcmath')) {
if (!function_exists('bcceil')) {
function bcceil(string $num): string { return p\Php84::bcceil($num); }
}
if (!function_exists('bcdivmod')) {
function bcdivmod(string $num1, string $num2, ?int $scale = null): ?array { return p\Php84::bcdivmod($num1, $num2, $scale); }
}
if (!function_exists('bcfloor')) {
function bcfloor(string $num): string { return p\Php84::bcfloor($num); }
}
if (!function_exists('bcround')) {
function bcround(string $num, int $precision = 0, $mode = RoundingMode::HalfAwayFromZero): string { return p\Php84::bcround($num, $precision, $mode); }
}
}
if (extension_loaded('intl') && !function_exists('grapheme_str_split')) {
function grapheme_str_split(string $string, int $length = 1) { return p\Php84::grapheme_str_split($string, $length); }
}

View File

@@ -0,0 +1,57 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Symfony\Polyfill\Php84 as p;
if (extension_loaded('mbstring')) {
if (!function_exists('mb_ucfirst')) {
function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Php84::mb_ucfirst($string, $encoding); }
}
if (!function_exists('mb_lcfirst')) {
function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Php84::mb_lcfirst($string, $encoding); }
}
if (!function_exists('mb_trim')) {
function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Php84::mb_trim($string, $characters, $encoding); }
}
if (!function_exists('mb_ltrim')) {
function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Php84::mb_ltrim($string, $characters, $encoding); }
}
if (!function_exists('mb_rtrim')) {
function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Php84::mb_rtrim($string, $characters, $encoding); }
}
}
if (extension_loaded('bcmath')) {
if (!function_exists('bcceil')) {
function bcceil(string $num): string { return p\Php84::bcceil($num); }
}
if (!function_exists('bcdivmod')) {
function bcdivmod(string $num1, string $num2, ?int $scale = null): ?array { return p\Php84::bcdivmod($num1, $num2, $scale); }
}
if (!function_exists('bcfloor')) {
function bcfloor(string $num): string { return p\Php84::bcfloor($num); }
}
if (!function_exists('bcround')) {
function bcround(string $num, int $precision = 0, $mode = RoundingMode::HalfAwayFromZero): string { return p\Php84::bcround($num, $precision, $mode); }
}
}
if (\PHP_VERSION_ID >= 80200) {
return require __DIR__.'/bootstrap82.php';
}
if (extension_loaded('intl') && !function_exists('grapheme_str_split')) {
function grapheme_str_split(string $string, int $length = 1) { return p\Php84::grapheme_str_split($string, $length); }
}

View File

@@ -0,0 +1,20 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Symfony\Polyfill\Php84 as p;
if (\PHP_VERSION_ID >= 80400) {
return;
}
if (extension_loaded('intl') && !function_exists('grapheme_str_split')) {
function grapheme_str_split(string $string, int $length = 1): array|false { return p\Php84::grapheme_str_split($string, $length); }
}

View File

@@ -0,0 +1,33 @@
{
"name": "symfony/polyfill-php84",
"type": "library",
"description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",
"keywords": ["polyfill", "shim", "compatibility", "portable"],
"homepage": "https://symfony.com",
"license": "MIT",
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"require": {
"php": ">=7.2"
},
"autoload": {
"psr-4": { "Symfony\\Polyfill\\Php84\\": "" },
"files": [ "bootstrap.php" ],
"classmap": [ "Resources/stubs" ]
},
"minimum-stability": "dev",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
}
}