diff --git a/src/Illuminate/Collections/Traits/EnumeratesValues.php b/src/Illuminate/Collections/Traits/EnumeratesValues.php index b9aee097b123..b42edb49d808 100644 --- a/src/Illuminate/Collections/Traits/EnumeratesValues.php +++ b/src/Illuminate/Collections/Traits/EnumeratesValues.php @@ -11,11 +11,13 @@ use Illuminate\Support\Collection; use Illuminate\Support\Enumerable; use Illuminate\Support\HigherOrderCollectionProxy; +use InvalidArgumentException; use JsonSerializable; use Symfony\Component\VarDumper\VarDumper; use Traversable; use UnexpectedValueException; use UnitEnum; +use WeakMap; /** * @template TKey of array-key @@ -1019,6 +1021,7 @@ protected function getArrayableItems($items) } return match (true) { + $items instanceof WeakMap => throw new InvalidArgumentException('Collections can not be created using instances of WeakMap.'), $items instanceof Enumerable => $items->all(), $items instanceof Arrayable => $items->toArray(), $items instanceof Traversable => iterator_to_array($items), diff --git a/tests/Support/SupportCollectionTest.php b/tests/Support/SupportCollectionTest.php index 6efeeba1be36..55fb1359d19c 100755 --- a/tests/Support/SupportCollectionTest.php +++ b/tests/Support/SupportCollectionTest.php @@ -19,12 +19,14 @@ use IteratorAggregate; use JsonSerializable; use Mockery as m; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use ReflectionClass; use stdClass; use Symfony\Component\VarDumper\VarDumper; use Traversable; use UnexpectedValueException; +use WeakMap; include_once 'Enums.php'; @@ -2957,6 +2959,19 @@ public function testConstructMethodFromObject($collection) $this->assertEquals(['foo' => 'bar'], $data->all()); } + #[DataProvider('collectionClassProvider')] + public function testConstructMethodFromWeakMap($collection) + { + $this->expectException('InvalidArgumentException'); + + $map = new WeakMap(); + $object = new stdClass; + $object->foo = 'bar'; + $map[$object] = 3; + + $data = new $collection($map); + } + public function testSplice() { $data = new Collection(['foo', 'baz']);