This commit is contained in:
Paolo A
2024-08-13 13:44:16 +00:00
parent 1bbb23088d
commit e796d76612
4001 changed files with 30101 additions and 40075 deletions

View File

@@ -14,9 +14,10 @@ declare(strict_types=1);
namespace Ramsey\Collection\Tool;
use Ramsey\Collection\Exception\ValueExtractionException;
use Ramsey\Collection\Exception\InvalidPropertyOrMethod;
use Ramsey\Collection\Exception\UnsupportedOperationException;
use function get_class;
use function is_array;
use function is_object;
use function method_exists;
use function property_exists;
@@ -28,34 +29,53 @@ use function sprintf;
trait ValueExtractorTrait
{
/**
* Extracts the value of the given property or method from the object.
* Extracts the value of the given property, method, or array key from the
* element.
*
* @param mixed $object The object to extract the value from.
* @param string $propertyOrMethod The property or method for which the
* If `$propertyOrMethod` is `null`, we return the element as-is.
*
* @param mixed $element The element to extract the value from.
* @param string | null $propertyOrMethod The property or method for which the
* value should be extracted.
*
* @return mixed the value extracted from the specified property or method.
* @return mixed the value extracted from the specified property, method,
* or array key, or the element itself.
*
* @throws ValueExtractionException if the method or property is not defined.
* @throws InvalidPropertyOrMethod
* @throws UnsupportedOperationException
*/
// phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
protected function extractValue($object, string $propertyOrMethod)
protected function extractValue(mixed $element, ?string $propertyOrMethod): mixed
{
if (!is_object($object)) {
throw new ValueExtractionException('Unable to extract a value from a non-object');
if ($propertyOrMethod === null) {
return $element;
}
if (property_exists($object, $propertyOrMethod)) {
return $object->$propertyOrMethod;
if (!is_object($element) && !is_array($element)) {
throw new UnsupportedOperationException(sprintf(
'The collection type "%s" does not support the $propertyOrMethod parameter',
$this->getType(),
));
}
if (method_exists($object, $propertyOrMethod)) {
return $object->{$propertyOrMethod}();
if (is_array($element)) {
return $element[$propertyOrMethod] ?? throw new InvalidPropertyOrMethod(sprintf(
'Key or index "%s" not found in collection elements',
$propertyOrMethod,
));
}
throw new ValueExtractionException(
// phpcs:ignore SlevomatCodingStandard.Classes.ModernClassNameReference.ClassNameReferencedViaFunctionCall
sprintf('Method or property "%s" not defined in %s', $propertyOrMethod, get_class($object)),
);
if (property_exists($element, $propertyOrMethod)) {
return $element->$propertyOrMethod;
}
if (method_exists($element, $propertyOrMethod)) {
return $element->{$propertyOrMethod}();
}
throw new InvalidPropertyOrMethod(sprintf(
'Method or property "%s" not defined in %s',
$propertyOrMethod,
$element::class,
));
}
}