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.
52 lines
1.3 KiB
52 lines
1.3 KiB
<?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;
|
|
}
|
|
}
|
|
|