5 Commits

Author SHA1 Message Date
8da3c1df38 20250224
[Д] [StringExtension::Replace] Функция заменяет все вхождения строки поиска на строку замены в заданной строке (аналог mb_str_replace).

[Д] [StringExtension::ReplaceAll] Функция заменяет все вхождения строк поиск на соответствующие строки замены в заданной строке.
2025-02-24 23:44:57 +03:00
07a994df83 20250223-1
[О] [ClassMapper::MapToClassProperty] и [ClassMapper::SetParameterToClass]: Исправлена ошибка, при которой некорректно переводился тип bool.
2025-02-23 14:05:30 +03:00
e09ea26a3c 20250223
[О] [ClassMapper::MapClass]: Отменена проверка свойства на доступность get и set, так как выдавала ошибку. Используйте лучше в таких случаях $options['ignored'] для таких свойств.
2025-02-23 11:34:19 +03:00
ebfd42a88e 20250222
[О] [ClassMapper::GetDefaults]: Улучшено определение типа. Теперь проверка integer не вызовет ошибку, что ожидается int.

[О] [ClassMapper::MapClass]: Теперь идёт проверка свойства на доступность get и set. Свойства с только get и только set пропускаются.
2025-02-22 13:09:54 +03:00
054e6a7cdc 20250221 2025-02-21 18:33:23 +03:00
7 changed files with 317 additions and 344 deletions

View File

@@ -16,11 +16,11 @@
} }
], ],
"require": { "require": {
"php": ">=8.4", "php": "^8.4",
"ext-mbstring": "*" "ext-mbstring": "*"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": ">=11.5.6" "phpunit/phpunit": "^12.0.4"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

532
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -211,6 +211,15 @@ final class ClassMapper
// -- тип свойства // -- тип свойства
$propertyType = $property->getType(); $propertyType = $property->getType();
// - если значение является типом bool
if ($propertyType->getName() === 'bool') {
// -- присваиваю дату
self::SetParameterToClass($classReflector, $key, $classObj, $value == "1");
// -- следующий элемент
continue;
}
// - если значение является классом // - если значение является классом
if (!$propertyType->isBuiltin() && is_array($value)) { if (!$propertyType->isBuiltin() && is_array($value)) {
// -- присваиваю объект // -- присваиваю объект
@@ -300,7 +309,7 @@ final class ClassMapper
$property->setAccessible(true); $property->setAccessible(true);
// Если значение null // Если значение null
if ($value == null || $value == "null") if (!is_bool($value) && ($value == null || $value == "null"))
// - то присваиваю значение по умолчанию // - то присваиваю значение по умолчанию
$value = self::GetDefaults($property->getType()->getName()); $value = self::GetDefaults($property->getType()->getName());
@@ -314,18 +323,18 @@ final class ClassMapper
} }
/** /**
* Получает значение по умолчанию для разных типов данных. * Возвращает значение по умолчанию для типа $typeName.
* *
* @param string $typeName Имя типа данных. * @param string $typeName Тип
* *
* @return mixed|null Результат. * @return mixed Значение по умолчанию
*/ */
public static function GetDefaults (string $typeName): mixed public static function GetDefaults (string $typeName): mixed
{ {
return match ($typeName) { return match (strtolower($typeName)) {
'int' => 0, 'int', 'integer' => 0,
'float' => 0.0, 'float', 'double' => 0.0,
'bool' => false, 'bool', 'boolean' => false,
'string' => '', 'string' => '',
'array' => [], 'array' => [],
'object' => new stdClass(), 'object' => new stdClass(),

View File

@@ -207,4 +207,63 @@ final class StringExtension
// Возвращаю обрезанный текст // Возвращаю обрезанный текст
return mb_substr($text, 0, $lengthWithoutEndDots) . $endDots; return mb_substr($text, 0, $lengthWithoutEndDots) . $endDots;
} }
/**
* Функция заменяет все вхождения строк поиск на соответствующие строки замены в заданной строке.
*
* @param array $searchReplace Массив с парами поиска и замены. Например, <code>['-' => '#', '$' => '%']</code>
* заменит все дефисы на # и все доллары на %.
* @param string $subject Строка, в которой нужно выполнить замену.
* @param string $encoding (необязательный) Кодировка (по умолчанию, UTF-8).
*
* @return string Возвращает новую строку с выполненными заменами.
*/
public static function ReplaceAll (array $searchReplace, string $subject, string $encoding = 'UTF-8'): string
{
// Создаю результат
$result = $subject;
// Для каждой пары поиска и замены
foreach ($searchReplace as $search => $replace)
// - заменяю все вхождения строки поиска на строку замены в заданной строке
$result = self::Replace($search, $replace, $result, $encoding);
// Возвращаю результат
return $result;
}
/**
* Функция заменяет все вхождения строки поиска на строку замены в заданной строке (аналог mb_str_replace).
*
* @param string $search Строка, которую нужно найти и заменить.
* @param string $replace Строка, на которую нужно заменить найденную строку.
* @param string $subject Строка, в которой нужно выполнить замену.
* @param string $encoding (необязательный) Кодировка (по умолчанию, UTF-8).
*
* @return string Возвращает новую строку с выполненной заменой.
*/
public static function Replace (string $search, string $replace, string $subject,
string $encoding = 'UTF-8'): string
{
// Если кодировка не UTF-8
if ($encoding != 'UTF-8') {
// - то перекодируем строку поиска, замены и исходную строку в UTF-8
$search = mb_convert_encoding($search, 'UTF-8', $encoding);
// - и перекодируем строку замены в UTF-8
$replace = mb_convert_encoding($replace, 'UTF-8', $encoding);
// - и перекодируем исходную строку в UTF-8
$subject = mb_convert_encoding($subject, 'UTF-8', $encoding);
}
// С помощью регулярного выражения заменяем все вхождения строки поиска на строку замены
$result = preg_replace('/' . preg_quote($search, '/') . '/u', $replace, $subject);
// Если кодировка не UTF-8
if ($encoding != 'UTF-8')
// - то перекодируем результат в исходную кодировку
$result = mb_convert_encoding($result, $encoding, 'UTF-8');
// Возвращаем результат
return $result;
}
} }

View File

@@ -3,6 +3,8 @@
namespace goodboyalex\php_components_pack\tests\classes; namespace goodboyalex\php_components_pack\tests\classes;
use goodboyalex\php_components_pack\classes\ClassMapper; use goodboyalex\php_components_pack\classes\ClassMapper;
use goodboyalex\php_components_pack\tests\data\A;
use goodboyalex\php_components_pack\tests\data\B;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class ClassMapperTest extends TestCase class ClassMapperTest extends TestCase
@@ -11,12 +13,10 @@ class ClassMapperTest extends TestCase
{ {
$this->PrepareForTest(); $this->PrepareForTest();
$a = new \goodboyalex\php_components_pack\tests\data\A(); $a = new A('a', 2, true);
$a->a = 'a';
$a->b = 2;
$a->c = true;
$b = new B(); $b = new B();
ClassMapper::MapClass($a, $b); ClassMapper::MapClass($a, $b);
$this->assertEquals('a', $b->a); $this->assertEquals('a', $b->a);

View File

@@ -1,10 +1,17 @@
<?php <?php
namespace goodboyalex\php_components_pack\tests\classes; namespace goodboyalex\php_components_pack\tests\data;
class B class B
{ {
public string $a; public string $a;
public int $b; public int $b;
public string $d; public string $d;
public function __construct (string $a = "", int $b = 0, string $d = "")
{
$this->a = $a;
$this->b = $b;
$this->d = $d;
}
} }

View File

@@ -63,4 +63,20 @@ class StringExtensionTest extends TestCase
$this->assertEquals('', StringExtension::GetShortText('test', 0)); $this->assertEquals('', StringExtension::GetShortText('test', 0));
} }
public function testReplace ()
{
$this->PrepareForTest();
$this->assertEquals('Все 2 ночи и 2 дня 2 друга искали тебя!',
StringExtension::Replace("4", "2", "Все 4 ночи и 4 дня 2 друга искали тебя!"));
}
public function testReplaceAll ()
{
$this->PrepareForTest();
$this->assertEquals('Все 5 ночи и 5 дня 2 друга искали тебя!',
StringExtension::ReplaceAll(["4" => "5", "3" => "2"], "Все 4 ночи и 4 дня 3 друга искали тебя!"));
}
} }