smoren / type-tools
PHP数据类型的各种操作助手
Requires
- php: >=7.4.0
Requires (Dev)
- codeception/codeception: ^4.2.1
- codeception/module-asserts: ^2.0
- php-coveralls/php-coveralls: ^2.0
- phpstan/phpstan: ^1.8
- squizlabs/php_codesniffer: 3.*
README
PHP数据类型、变量和容器操作的助手
如何安装到您的项目
composer require smoren/type-tools
快速参考
独特提取器
对象类型转换器
对象访问
映射访问
用法
独特提取器
提取任何PHP变量和数据结构唯一ID和散列的工具。
工作在两种模式下:严格和非严格。
在严格模式下
- 标量:严格按类型唯一;
- 对象:按实例唯一;
- 数组:按序列化值唯一;
- 资源:结果按实例唯一。
在非严格模式下
- 标量:按值唯一;
- 对象:按序列化值唯一;
- 数组:按序列化值唯一;
- 资源:结果按实例唯一。
获取字符串
返回给定变量的唯一字符串。
UniqueExtractor::getString(mixed $var, bool $strict): string
use Smoren\TypeTools\UniqueExtractor; $intValue = 5; $floatValue = 5.0; $intValueStrictUniqueId = UniqueExtractor::getString($intValue, true); $floatValueStrictUniqueId = UniqueExtractor::getString($floatValue, true); var_dump($intValueStrictUniqueId === $floatValueStrictUniqueId); // false $intValueNonStrictUniqueId = UniqueExtractor::getString($intValue, false); $floatValueNonStrictUniqueId = UniqueExtractor::getString($floatValue, false); var_dump($intValueNonStrictUniqueId === $floatValueNonStrictUniqueId); // true
获取散列
返回给定变量的唯一md5散列字符串。
UniqueExtractor::getHash(mixed $var, bool $strict): string
use Smoren\TypeTools\UniqueExtractor; $intValue = 5; $floatValue = 5.0; $intValueStrictHash = UniqueExtractor::getHash($intValue, true); $floatValueStrictHash = UniqueExtractor::getHash($floatValue, true); var_dump($intValueStrictHash === $floatValueStrictHash); // false $intValueNonStrictHash = UniqueExtractor::getHash($intValue, false); $floatValueNonStrictHash = UniqueExtractor::getHash($floatValue, false); var_dump($intValueNonStrictHash === $floatValueNonStrictHash); // true
对象类型转换器
类型转换对象的工具。
转换
将对象转换为另一个相关类型(上转换或下转换)。
ObjectTypeCaster::cast(object $sourceObject, string $destinationClass): mixed
use Smoren\TypeTools\ObjectTypeCaster; class ParentClass { public int $a; protected int $b; public function __construct(int $a, int $b) { $this->a = $a; $this->b = $b; } public function toArray(): array { return [$this->a, $this->b]; } } class ChildClass extends ParentClass { private $c = null; public function __construct(int $a, int $b, int $c) { parent::__construct($a, $b); $this->c = $c; } public function toArray(): array { return [$this->a, $this->b, $this->c]; } } /* Downcast */ $parentClassObject = new ParentClass(1, 2); print_r($parentClassObject->toArray()); // [1, 2] $castedToChildClass = ObjectTypeCaster::cast($parentClassObject, ChildClass::class); print_r($castedToChildClass->toArray()); // [1, 2, null] var_dump(get_class($castedToChildClass)); // ChildClass /* Upcast */ $childClassObject = new ChildClass(1, 2, 3); print_r($childClassObject->toArray()); // [1, 2, 3] $castedToParentClass = ObjectTypeCaster::cast($childClassObject, ParentClass::class); print_r($castedToParentClass->toArray()); // [1, 2] var_dump(get_class($castedToParentClass)); // ParentClass
对象访问
反映和访问对象属性和方法的工具。
获取属性值
返回对象属性的值。
ObjectAccess::getPropertyValue(object $object, string $propertyName): mixed
可以通过名称或getter访问属性。
如果属性不可读,则抛出Smoren\TypeTools\Exceptions\KeyError
。
use Smoren\TypeTools\ObjectAccess; class MyClass { public int $publicProperty = 1; private int $privateProperty = 2; public function getPrivateProperty(): int { return $this->privateProperty; } } $myObject = new MyClass(); // Getting by name: var_dump(ObjectAccess::getPropertyValue($myObject, 'publicProperty')); // 1 // Getting by getter (getPrivateProperty()): var_dump(ObjectAccess::getPropertyValue($myObject, 'privateProperty')); // 2
设置属性值
设置对象属性的值。
ObjectAccess::setPropertyValue(object $object, string $propertyName, mixed $value): void
可以通过名称或setter访问属性。
如果属性不可写,则抛出Smoren\TypeTools\Exceptions\KeyError
。
use Smoren\TypeTools\ObjectAccess; class MyClass { public int $publicProperty = 1; private int $privateProperty = 2; public function setPrivateProperty(int $value): void { $this->privateProperty = $value; } public function toArray(): array { return [$this->publicProperty, $this->privateProperty]; } } $myObject = new MyClass(); // Setting by name: ObjectAccess::setPropertyValue($myObject, 'publicProperty', 11); // Setting by setter (setPrivateProperty()): ObjectAccess::getPropertyValue($myObject, 'privateProperty', 22); print_r($myObject->toArray()); // [11, 22]
有可读属性
如果对象通过名称或getter有可读属性,则返回true。
ObjectAccess::hasReadableProperty(object $object, string $propertyName): bool
use Smoren\TypeTools\ObjectAccess; class MyClass { public int $publicProperty = 1; private int $privateProperty = 2; private int $notAccessibleProperty = 3; public function getPrivateProperty(): int { return $this->privateProperty; } } $myObject = new MyClass(); // Accessible by name: var_dump(ObjectAccess::hasReadableProperty($myObject, 'publicProperty')); // true // Accessible by getter: var_dump(ObjectAccess::hasReadableProperty($myObject, 'privateProperty')); // true // Not accessible: var_dump(ObjectAccess::hasReadableProperty($myObject, 'notAccessibleProperty')); // false
有可写属性
如果对象通过名称或setter有可写属性,则返回true。
ObjectAccess::hasWritableProperty(object $object, string $propertyName): bool
use Smoren\TypeTools\ObjectAccess; class MyClass { public int $publicProperty = 1; private int $privateProperty = 2; private int $notAccessibleProperty = 3; public function setPrivateProperty(int $value): void { $this->privateProperty = $value; } } $myObject = new MyClass(); // Accessible by name: var_dump(ObjectAccess::hasWritableProperty($myObject, 'publicProperty')); // true // Accessible by setter: var_dump(ObjectAccess::hasWritableProperty($myObject, 'privateProperty')); // true // Not accessible: var_dump(ObjectAccess::hasWritableProperty($myObject, 'notAccessibleProperty')); // false
有公共属性
如果对象有公共属性,则返回true。
ObjectAccess::hasPublicProperty(object $object, string $propertyName): bool
use Smoren\TypeTools\ObjectAccess; class MyClass { public int $publicProperty = 1; private int $privateProperty = 2; } $myObject = new MyClass(); var_dump(ObjectAccess::hasPublicProperty($myObject, 'publicProperty')); // true var_dump(ObjectAccess::hasPublicProperty($myObject, 'privateProperty')); // false
有公共方法
如果对象有公共方法,则返回true。
ObjectAccess::hasPublicMethod(object $object, string $methodName): bool
use Smoren\TypeTools\ObjectAccess; class MyClass { public function publicMethod(): int { return 1; } private function privateMethod(): int { return 2; } } $myObject = new MyClass(); var_dump(ObjectAccess::hasPublicMethod($myObject, 'publicMethod')); // true var_dump(ObjectAccess::hasPublicMethod($myObject, 'privateMethod')); // false
有属性
如果对象有属性,则返回true。
ObjectAccess::hasProperty(object $object, string $propertyName): bool
use Smoren\TypeTools\ObjectAccess; class MyClass { public int $publicProperty = 1; private int $privateProperty = 2; } $myObject = new MyClass(); var_dump(ObjectAccess::hasProperty($myObject, 'publicProperty')); // true var_dump(ObjectAccess::hasProperty($myObject, 'privateProperty')); // true var_dump(ObjectAccess::hasProperty($myObject, 'anotherProperty')); // false
有方法
如果对象有方法,则返回true。
ObjectAccess::hasMethod(object $object, string $methodName): bool
use Smoren\TypeTools\ObjectAccess; class MyClass { public function publicMethod(): int { return 1; } private function privateMethod(): int { return 2; } } $myObject = new MyClass(); var_dump(ObjectAccess::hasMethod($myObject, 'publicMethod')); // true var_dump(ObjectAccess::hasMethod($myObject, 'privateMethod')); // true
映射访问
通过字符串键映射访问不同容器的工具。
可以访问
- 对象的属性(通过名称或getter);
- 数组和ArrayAccess对象的元素(通过键)。
获取
通过键从容器中返回值,如果键不存在或不可访问,则返回默认值。
如果键不可读,则抛出Smoren\TypeTools\Exceptions\KeyError
。
MapAccess::get(mixed $container, string $key, mixed $defaultValue = null): mixed
use Smoren\TypeTools\MapAccess; $array = [ 'a' => 1, ]; var_dump(MapAccess::get($array, 'a', 0)); // 1 var_dump(MapAccess::get($array, 'b', 0)); // 0 var_dump(MapAccess::get($array, 'b')); // null class MyClass { public int $publicProperty = 1; private int $privateProperty = 2; private int $notAccessibleProperty = 3; public function getPrivateProperty(): int { return $this->privateProperty; } } $myObject = new MyClass(); // Accessible by name: var_dump(MapAccess::get($myObject, 'publicProperty', 0)); // 1 // Accessible by getter: var_dump(MapAccess::get($myObject, 'privateProperty')); // 2 // Not accessible: var_dump(MapAccess::get($myObject, 'notAccessibleProperty', -1)); // -1 var_dump(MapAccess::get($myObject, 'notAccessibleProperty')); // null // Nonexistent: var_dump(MapAccess::get($myObject, 'nonexistentProperty', -1)); // -1 var_dump(MapAccess::get($myObject, 'nonexistentProperty')); // null
设置
通过键向容器中设置值。
MapAccess::set(mixed $container, string $key, mixed $value): void
如果键不可写,则抛出Smoren\TypeTools\Exceptions\KeyError
。
use Smoren\TypeTools\MapAccess; $array = [ 'a' => 1, ]; MapAccess::set($array, 'a', 11); MapAccess::set($array, 'b', 22); print_r($array); // ['a' => 11, 'b' => 22] class MyClass { public int $publicProperty = 1; private int $privateProperty = 2; public function setPrivateProperty(int $value): void { $this->privateProperty = $value; } public function toArray(): array { return [$this->publicProperty, $this->privateProperty]; } } $myObject = new MyClass(); // Accessible by name: MapAccess::get($myObject, 'publicProperty', 11); // Accessible by getter: MapAccess::get($myObject, 'privateProperty', 22); print_r($myObject->toArray()); // [11, 22]
存在
如果容器中存在可访问的关键字,则返回 true。
MapAccess::exists(mixed $container, string $key): bool
use Smoren\TypeTools\MapAccess; $array = [ 'a' => 1, ]; var_dump(MapAccess::exists($array, 'a')); // true var_dump(MapAccess::exists($array, 'b')); // false class MyClass { public int $publicProperty = 1; private int $privateProperty = 2; private int $notAccessibleProperty = 3; public function getPrivateProperty(): int { return $this->privateProperty; } } $myObject = new MyClass(); // Accessible by name: var_dump(MapAccess::exists($myObject, 'publicProperty')); // true // Accessible by getter: var_dump(MapAccess::exists($myObject, 'privateProperty')); // true // Not accessible: var_dump(MapAccess::get($myObject, 'notAccessibleProperty')); // false // Nonexistent: var_dump(MapAccess::get($myObject, 'nonexistentProperty', -1)); // false
单元测试
composer install
composer test-init
composer test
许可证
PHP 类型工具采用 MIT 许可证。