You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.3 KiB
53 lines
1.3 KiB
3 years ago
|
<?php
|
||
|
|
||
|
namespace DeepCopy\Matcher;
|
||
|
|
||
|
use DeepCopy\Reflection\ReflectionHelper;
|
||
|
use ReflectionException;
|
||
|
|
||
|
/**
|
||
|
* Matches a property by its type.
|
||
|
*
|
||
|
* It is recommended to use {@see DeepCopy\TypeFilter\TypeFilter} instead, as it applies on all occurrences
|
||
|
* of given type in copied context (eg. array elements), not just on object properties.
|
||
|
*
|
||
|
* @final
|
||
|
*/
|
||
|
class PropertyTypeMatcher implements Matcher
|
||
|
{
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
private $propertyType;
|
||
|
|
||
|
/**
|
||
|
* @param string $propertyType Property type
|
||
|
*/
|
||
|
public function __construct($propertyType)
|
||
|
{
|
||
|
$this->propertyType = $propertyType;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* {@inheritdoc}
|
||
|
*/
|
||
|
public function matches($object, $property)
|
||
|
{
|
||
|
try {
|
||
|
$reflectionProperty = ReflectionHelper::getProperty($object, $property);
|
||
|
} catch (ReflectionException $exception) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$reflectionProperty->setAccessible(true);
|
||
|
|
||
|
// Uninitialized properties (for PHP >7.4)
|
||
|
if (method_exists($reflectionProperty, 'isInitialized') && !$reflectionProperty->isInitialized($object)) {
|
||
|
// null instanceof $this->propertyType
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return $reflectionProperty->getValue($object) instanceof $this->propertyType;
|
||
|
}
|
||
|
}
|