From 49428242d254cfb65cdd666fe9c4caba99741b55 Mon Sep 17 00:00:00 2001
From: Vincent Langlet <vincentlanglet@hotmail.fr>
Date: Thu, 22 May 2025 10:25:32 +0200
Subject: [PATCH 1/8] Getenv

---
 conf/config.neon                              |  5 ++
 resources/functionMap_php80delta.php          |  2 +
 src/Php/PhpVersion.php                        |  5 ++
 .../Php/GetenvFunctionReturnTypeExtension.php | 49 +++++++++++++++++++
 .../Analyser/NodeScopeResolverTest.php        |  6 +++
 tests/PHPStan/Analyser/data/getenv-php74.php  | 17 +++++++
 tests/PHPStan/Analyser/data/getenv-php80.php  | 17 +++++++
 .../CallToFunctionParametersRuleTest.php      | 14 ++++++
 .../Rules/Functions/data/bug-13065.php        | 15 ++++++
 9 files changed, 130 insertions(+)
 create mode 100644 src/Type/Php/GetenvFunctionReturnTypeExtension.php
 create mode 100644 tests/PHPStan/Analyser/data/getenv-php74.php
 create mode 100644 tests/PHPStan/Analyser/data/getenv-php80.php
 create mode 100644 tests/PHPStan/Rules/Functions/data/bug-13065.php

diff --git a/conf/config.neon b/conf/config.neon
index 099a7e214b..8eb0b0bf55 100644
--- a/conf/config.neon
+++ b/conf/config.neon
@@ -1541,6 +1541,11 @@ services:
 		tags:
 			- phpstan.broker.dynamicFunctionReturnTypeExtension
 
+	-
+		class: PHPStan\Type\Php\GetenvFunctionReturnTypeExtension
+		tags:
+			- phpstan.broker.dynamicFunctionReturnTypeExtension
+
 	-
 		class: PHPStan\Type\Php\GetParentClassDynamicFunctionReturnTypeExtension
 		tags:
diff --git a/resources/functionMap_php80delta.php b/resources/functionMap_php80delta.php
index c6a9dfe91a..c55054122a 100644
--- a/resources/functionMap_php80delta.php
+++ b/resources/functionMap_php80delta.php
@@ -78,6 +78,8 @@
 		'imagejpeg' => ['bool', 'im'=>'GdImage', 'filename='=>'string|resource|null', 'quality='=>'int'],
 		'imagerotate' => ['false|object', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'],
 		'imagescale' => ['false|object', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'],
+		'getenv' => ['array<string, string>|string|false', 'varname'=>'string|null', 'local_only='=>'bool'],
+		'getenv\'1' => ['array<string, string>'],
 		'ldap_set_rebind_proc' => ['bool', 'ldap'=>'resource', 'callback'=>'?callable'],
 		'mb_decode_numericentity' => ['string|false', 'string'=>'string', 'convmap'=>'array', 'encoding='=>'string'],
 		'mb_encoding_aliases' => ['list<non-falsy-string>', 'encoding'=>'string'],
diff --git a/src/Php/PhpVersion.php b/src/Php/PhpVersion.php
index b275c464eb..9ef01c8475 100644
--- a/src/Php/PhpVersion.php
+++ b/src/Php/PhpVersion.php
@@ -353,4 +353,9 @@ public function substrReturnFalseInsteadOfEmptyString(): bool
 		return $this->versionId < 80000;
 	}
 
+	public function getenvAcceptsNull(): bool
+	{
+		return $this->versionId >= 80000;
+	}
+
 }
diff --git a/src/Type/Php/GetenvFunctionReturnTypeExtension.php b/src/Type/Php/GetenvFunctionReturnTypeExtension.php
new file mode 100644
index 0000000000..40db69a697
--- /dev/null
+++ b/src/Type/Php/GetenvFunctionReturnTypeExtension.php
@@ -0,0 +1,49 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Type\Php;
+
+use PhpParser\Node\Expr\FuncCall;
+use PHPStan\Analyser\Scope;
+use PHPStan\Php\PhpVersion;
+use PHPStan\Reflection\FunctionReflection;
+use PHPStan\Type\ArrayType;
+use PHPStan\Type\Constant\ConstantBooleanType;
+use PHPStan\Type\DynamicFunctionReturnTypeExtension;
+use PHPStan\Type\StringType;
+use PHPStan\Type\Type;
+use PHPStan\Type\UnionType;
+use function count;
+
+final class GetenvFunctionReturnTypeExtension implements DynamicFunctionReturnTypeExtension
+{
+
+	public function __construct(private PhpVersion $phpVersion)
+	{
+	}
+
+	public function isFunctionSupported(FunctionReflection $functionReflection): bool
+	{
+		return $functionReflection->getName() === 'getenv';
+	}
+
+	public function getTypeFromFunctionCall(FunctionReflection $functionReflection, FuncCall $functionCall, Scope $scope): ?Type
+	{
+		if (!$this->phpVersion->getenvAcceptsNull()) {
+			return null;
+		}
+		if (count($functionCall->getArgs()) < 1) {
+			return null;
+		}
+
+		$argType = $scope->getType($functionCall->getArgs()[0]->value);
+		if ($argType->isNull()->yes()) {
+			return new ArrayType(new StringType(), new StringType());
+		}
+		if ($argType->isNull()->no()) {
+			return new UnionType([new StringType(), new ConstantBooleanType(false)]);
+		}
+
+		return null;
+	}
+
+}
diff --git a/tests/PHPStan/Analyser/NodeScopeResolverTest.php b/tests/PHPStan/Analyser/NodeScopeResolverTest.php
index 1e3afb4e70..2ce2ec4583 100644
--- a/tests/PHPStan/Analyser/NodeScopeResolverTest.php
+++ b/tests/PHPStan/Analyser/NodeScopeResolverTest.php
@@ -57,6 +57,12 @@ private static function findTestFiles(): iterable
 			yield __DIR__ . '/data/explode-php80.php';
 		}
 
+		if (PHP_VERSION_ID < 80000) {
+			yield __DIR__ . '/data/getenv-php74.php';
+		} else {
+			yield __DIR__ . '/data/getenv-php80.php';
+		}
+
 		if (PHP_VERSION_ID >= 80000) {
 			yield __DIR__ . '/../Reflection/data/unionTypes.php';
 			yield __DIR__ . '/../Reflection/data/mixedType.php';
diff --git a/tests/PHPStan/Analyser/data/getenv-php74.php b/tests/PHPStan/Analyser/data/getenv-php74.php
new file mode 100644
index 0000000000..2f2540eeef
--- /dev/null
+++ b/tests/PHPStan/Analyser/data/getenv-php74.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace GetenvPHP74;
+
+use function PHPStan\Testing\assertType;
+
+class Foo
+{
+
+	public function test()
+	{
+		assertType('string|false', getenv(null));
+		assertType('array<string, string>', getenv());
+		assertType('string|false', getenv('foo'));
+	}
+
+}
diff --git a/tests/PHPStan/Analyser/data/getenv-php80.php b/tests/PHPStan/Analyser/data/getenv-php80.php
new file mode 100644
index 0000000000..17610b82b3
--- /dev/null
+++ b/tests/PHPStan/Analyser/data/getenv-php80.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace GetenvPHP80;
+
+use function PHPStan\Testing\assertType;
+
+class Foo
+{
+
+	public function test()
+	{
+		assertType('array<string, string>', getenv(null));
+		assertType('array<string, string>', getenv());
+		assertType('string|false', getenv('foo'));
+	}
+
+}
diff --git a/tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php b/tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php
index 31538252d8..e6347cdd8d 100644
--- a/tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php
+++ b/tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php
@@ -2102,4 +2102,18 @@ public function testBug12499(): void
 		$this->analyse([__DIR__ . '/data/bug-12499.php'], []);
 	}
 
+	public function testBug13065(): void
+	{
+		if (PHP_VERSION_ID < 80000) {
+			$this->analyse([__DIR__ . '/data/bug-13065.php'], [
+				[
+					'Parameter #1 $varname of function getenv expects string, null given.',
+					10,
+				],
+			]);
+		} else {
+			$this->analyse([__DIR__ . '/data/bug-13065.php'], []);
+		}
+	}
+
 }
diff --git a/tests/PHPStan/Rules/Functions/data/bug-13065.php b/tests/PHPStan/Rules/Functions/data/bug-13065.php
new file mode 100644
index 0000000000..f63acf9989
--- /dev/null
+++ b/tests/PHPStan/Rules/Functions/data/bug-13065.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Bug13065;
+
+class Foo
+{
+
+	public function test()
+	{
+		getenv(null);
+		getenv();
+		getenv('foo');
+	}
+
+}

From a0b450430b8e3a4727f651d7d8020e458f3997d5 Mon Sep 17 00:00:00 2001
From: Vincent Langlet <vincentlanglet@hotmail.fr>
Date: Thu, 22 May 2025 11:27:22 +0200
Subject: [PATCH 2/8] Review

---
 .../CallToFunctionParametersRuleTest.php          | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php b/tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php
index e6347cdd8d..9358802c16 100644
--- a/tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php
+++ b/tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php
@@ -2104,16 +2104,15 @@ public function testBug12499(): void
 
 	public function testBug13065(): void
 	{
+		$errors = [];
 		if (PHP_VERSION_ID < 80000) {
-			$this->analyse([__DIR__ . '/data/bug-13065.php'], [
-				[
-					'Parameter #1 $varname of function getenv expects string, null given.',
-					10,
-				],
-			]);
-		} else {
-			$this->analyse([__DIR__ . '/data/bug-13065.php'], []);
+			$errors[] = [
+				'Parameter #1 $varname of function getenv expects string, null given.',
+				10,
+			];
 		}
+
+		$this->analyse([__DIR__ . '/data/bug-13065.php'], $errors);
 	}
 
 }

From 9c05317656b9dc3ba32d66fc0e39ee0f94f3fadc Mon Sep 17 00:00:00 2001
From: Vincent Langlet <vincentlanglet@hotmail.fr>
Date: Thu, 22 May 2025 11:35:46 +0200
Subject: [PATCH 3/8] Try

---
 conf/config.neon                     | 5 -----
 resources/functionMap_php80delta.php | 6 ++++--
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/conf/config.neon b/conf/config.neon
index 8eb0b0bf55..099a7e214b 100644
--- a/conf/config.neon
+++ b/conf/config.neon
@@ -1541,11 +1541,6 @@ services:
 		tags:
 			- phpstan.broker.dynamicFunctionReturnTypeExtension
 
-	-
-		class: PHPStan\Type\Php\GetenvFunctionReturnTypeExtension
-		tags:
-			- phpstan.broker.dynamicFunctionReturnTypeExtension
-
 	-
 		class: PHPStan\Type\Php\GetParentClassDynamicFunctionReturnTypeExtension
 		tags:
diff --git a/resources/functionMap_php80delta.php b/resources/functionMap_php80delta.php
index c55054122a..afe46d90e2 100644
--- a/resources/functionMap_php80delta.php
+++ b/resources/functionMap_php80delta.php
@@ -78,8 +78,10 @@
 		'imagejpeg' => ['bool', 'im'=>'GdImage', 'filename='=>'string|resource|null', 'quality='=>'int'],
 		'imagerotate' => ['false|object', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'],
 		'imagescale' => ['false|object', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'],
-		'getenv' => ['array<string, string>|string|false', 'varname'=>'string|null', 'local_only='=>'bool'],
-		'getenv\'1' => ['array<string, string>'],
+		'getenv' => ['array<string, string>', 'varname'=>'null', 'local_only='=>'bool'],
+		'getenv\'1' => ['string|false', 'varname'=>'string', 'local_only='=>'bool'],
+		'getenv\'2' => ['array<string, string>|string|false', 'varname'=>'string|null', 'local_only='=>'bool'],
+		'getenv\'3' => ['array<string, string>'],
 		'ldap_set_rebind_proc' => ['bool', 'ldap'=>'resource', 'callback'=>'?callable'],
 		'mb_decode_numericentity' => ['string|false', 'string'=>'string', 'convmap'=>'array', 'encoding='=>'string'],
 		'mb_encoding_aliases' => ['list<non-falsy-string>', 'encoding'=>'string'],

From ebe11b802ae530cc31aeb83a7153824f95758e70 Mon Sep 17 00:00:00 2001
From: Vincent Langlet <vincentlanglet@hotmail.fr>
Date: Thu, 22 May 2025 11:43:59 +0200
Subject: [PATCH 4/8] Revert "Try"

This reverts commit 26db34a8ea005476e067fd2fe79bd3596b4935e3.
---
 conf/config.neon                     | 5 +++++
 resources/functionMap_php80delta.php | 6 ++----
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/conf/config.neon b/conf/config.neon
index 099a7e214b..8eb0b0bf55 100644
--- a/conf/config.neon
+++ b/conf/config.neon
@@ -1541,6 +1541,11 @@ services:
 		tags:
 			- phpstan.broker.dynamicFunctionReturnTypeExtension
 
+	-
+		class: PHPStan\Type\Php\GetenvFunctionReturnTypeExtension
+		tags:
+			- phpstan.broker.dynamicFunctionReturnTypeExtension
+
 	-
 		class: PHPStan\Type\Php\GetParentClassDynamicFunctionReturnTypeExtension
 		tags:
diff --git a/resources/functionMap_php80delta.php b/resources/functionMap_php80delta.php
index afe46d90e2..c55054122a 100644
--- a/resources/functionMap_php80delta.php
+++ b/resources/functionMap_php80delta.php
@@ -78,10 +78,8 @@
 		'imagejpeg' => ['bool', 'im'=>'GdImage', 'filename='=>'string|resource|null', 'quality='=>'int'],
 		'imagerotate' => ['false|object', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'],
 		'imagescale' => ['false|object', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'],
-		'getenv' => ['array<string, string>', 'varname'=>'null', 'local_only='=>'bool'],
-		'getenv\'1' => ['string|false', 'varname'=>'string', 'local_only='=>'bool'],
-		'getenv\'2' => ['array<string, string>|string|false', 'varname'=>'string|null', 'local_only='=>'bool'],
-		'getenv\'3' => ['array<string, string>'],
+		'getenv' => ['array<string, string>|string|false', 'varname'=>'string|null', 'local_only='=>'bool'],
+		'getenv\'1' => ['array<string, string>'],
 		'ldap_set_rebind_proc' => ['bool', 'ldap'=>'resource', 'callback'=>'?callable'],
 		'mb_decode_numericentity' => ['string|false', 'string'=>'string', 'convmap'=>'array', 'encoding='=>'string'],
 		'mb_encoding_aliases' => ['list<non-falsy-string>', 'encoding'=>'string'],

From 6bc4f2cca53ec68c0a9eb9d230cd98afb0990ac4 Mon Sep 17 00:00:00 2001
From: Ondrej Mirtes <ondrej@mirtes.cz>
Date: Thu, 22 May 2025 14:39:33 +0200
Subject: [PATCH 5/8] Try again

---
 conf/config.neon                              |  5 --
 resources/functionMap_php80delta.php          |  4 +-
 .../Php/GetenvFunctionReturnTypeExtension.php | 49 -------------------
 3 files changed, 2 insertions(+), 56 deletions(-)
 delete mode 100644 src/Type/Php/GetenvFunctionReturnTypeExtension.php

diff --git a/conf/config.neon b/conf/config.neon
index 8eb0b0bf55..099a7e214b 100644
--- a/conf/config.neon
+++ b/conf/config.neon
@@ -1541,11 +1541,6 @@ services:
 		tags:
 			- phpstan.broker.dynamicFunctionReturnTypeExtension
 
-	-
-		class: PHPStan\Type\Php\GetenvFunctionReturnTypeExtension
-		tags:
-			- phpstan.broker.dynamicFunctionReturnTypeExtension
-
 	-
 		class: PHPStan\Type\Php\GetParentClassDynamicFunctionReturnTypeExtension
 		tags:
diff --git a/resources/functionMap_php80delta.php b/resources/functionMap_php80delta.php
index c55054122a..ec070388a3 100644
--- a/resources/functionMap_php80delta.php
+++ b/resources/functionMap_php80delta.php
@@ -78,8 +78,8 @@
 		'imagejpeg' => ['bool', 'im'=>'GdImage', 'filename='=>'string|resource|null', 'quality='=>'int'],
 		'imagerotate' => ['false|object', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'],
 		'imagescale' => ['false|object', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'],
-		'getenv' => ['array<string, string>|string|false', 'varname'=>'string|null', 'local_only='=>'bool'],
-		'getenv\'1' => ['array<string, string>'],
+		'getenv' => ['string|false', 'varname'=>'string', 'local_only='=>'bool'],
+		'getenv\'1' => ['array<string, string>', 'varname='=>'null', 'local_only='=>'bool'],
 		'ldap_set_rebind_proc' => ['bool', 'ldap'=>'resource', 'callback'=>'?callable'],
 		'mb_decode_numericentity' => ['string|false', 'string'=>'string', 'convmap'=>'array', 'encoding='=>'string'],
 		'mb_encoding_aliases' => ['list<non-falsy-string>', 'encoding'=>'string'],
diff --git a/src/Type/Php/GetenvFunctionReturnTypeExtension.php b/src/Type/Php/GetenvFunctionReturnTypeExtension.php
deleted file mode 100644
index 40db69a697..0000000000
--- a/src/Type/Php/GetenvFunctionReturnTypeExtension.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php declare(strict_types = 1);
-
-namespace PHPStan\Type\Php;
-
-use PhpParser\Node\Expr\FuncCall;
-use PHPStan\Analyser\Scope;
-use PHPStan\Php\PhpVersion;
-use PHPStan\Reflection\FunctionReflection;
-use PHPStan\Type\ArrayType;
-use PHPStan\Type\Constant\ConstantBooleanType;
-use PHPStan\Type\DynamicFunctionReturnTypeExtension;
-use PHPStan\Type\StringType;
-use PHPStan\Type\Type;
-use PHPStan\Type\UnionType;
-use function count;
-
-final class GetenvFunctionReturnTypeExtension implements DynamicFunctionReturnTypeExtension
-{
-
-	public function __construct(private PhpVersion $phpVersion)
-	{
-	}
-
-	public function isFunctionSupported(FunctionReflection $functionReflection): bool
-	{
-		return $functionReflection->getName() === 'getenv';
-	}
-
-	public function getTypeFromFunctionCall(FunctionReflection $functionReflection, FuncCall $functionCall, Scope $scope): ?Type
-	{
-		if (!$this->phpVersion->getenvAcceptsNull()) {
-			return null;
-		}
-		if (count($functionCall->getArgs()) < 1) {
-			return null;
-		}
-
-		$argType = $scope->getType($functionCall->getArgs()[0]->value);
-		if ($argType->isNull()->yes()) {
-			return new ArrayType(new StringType(), new StringType());
-		}
-		if ($argType->isNull()->no()) {
-			return new UnionType([new StringType(), new ConstantBooleanType(false)]);
-		}
-
-		return null;
-	}
-
-}

From 647fc095fbf82b88e3ea5e1188128a0f56fd9a20 Mon Sep 17 00:00:00 2001
From: Vincent Langlet <vincentlanglet@hotmail.fr>
Date: Thu, 22 May 2025 16:07:47 +0200
Subject: [PATCH 6/8] Add test

---
 tests/PHPStan/Analyser/data/getenv-php74.php | 5 ++++-
 tests/PHPStan/Analyser/data/getenv-php80.php | 5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/tests/PHPStan/Analyser/data/getenv-php74.php b/tests/PHPStan/Analyser/data/getenv-php74.php
index 2f2540eeef..f8769b28cd 100644
--- a/tests/PHPStan/Analyser/data/getenv-php74.php
+++ b/tests/PHPStan/Analyser/data/getenv-php74.php
@@ -7,11 +7,14 @@
 class Foo
 {
 
-	public function test()
+	public function test(string|null $stringOrNull, mixed $mixed)
 	{
 		assertType('string|false', getenv(null));
 		assertType('array<string, string>', getenv());
 		assertType('string|false', getenv('foo'));
+
+		assertType('string|false', getenv($stringOrNull));
+		assertType('string|false', getenv($mixed));
 	}
 
 }
diff --git a/tests/PHPStan/Analyser/data/getenv-php80.php b/tests/PHPStan/Analyser/data/getenv-php80.php
index 17610b82b3..572dea1700 100644
--- a/tests/PHPStan/Analyser/data/getenv-php80.php
+++ b/tests/PHPStan/Analyser/data/getenv-php80.php
@@ -7,11 +7,14 @@
 class Foo
 {
 
-	public function test()
+	public function test(string|null $stringOrNull, mixed $mixed)
 	{
 		assertType('array<string, string>', getenv(null));
 		assertType('array<string, string>', getenv());
 		assertType('string|false', getenv('foo'));
+
+		assertType('array<string, string>|string|false', getenv($stringOrNull));
+		assertType('array<string, string>|string|false', getenv($mixed));
 	}
 
 }

From b4d341013801ca583c1b81af77cf82ba05acc403 Mon Sep 17 00:00:00 2001
From: Vincent Langlet <vincentlanglet@hotmail.fr>
Date: Thu, 22 May 2025 16:22:08 +0200
Subject: [PATCH 7/8] Move to nsrt

---
 tests/PHPStan/Analyser/NodeScopeResolverTest.php       | 6 ------
 tests/PHPStan/Analyser/{data => nsrt}/getenv-php74.php | 2 +-
 tests/PHPStan/Analyser/{data => nsrt}/getenv-php80.php | 2 +-
 3 files changed, 2 insertions(+), 8 deletions(-)
 rename tests/PHPStan/Analyser/{data => nsrt}/getenv-php74.php (94%)
 rename tests/PHPStan/Analyser/{data => nsrt}/getenv-php80.php (95%)

diff --git a/tests/PHPStan/Analyser/NodeScopeResolverTest.php b/tests/PHPStan/Analyser/NodeScopeResolverTest.php
index 2ce2ec4583..1e3afb4e70 100644
--- a/tests/PHPStan/Analyser/NodeScopeResolverTest.php
+++ b/tests/PHPStan/Analyser/NodeScopeResolverTest.php
@@ -57,12 +57,6 @@ private static function findTestFiles(): iterable
 			yield __DIR__ . '/data/explode-php80.php';
 		}
 
-		if (PHP_VERSION_ID < 80000) {
-			yield __DIR__ . '/data/getenv-php74.php';
-		} else {
-			yield __DIR__ . '/data/getenv-php80.php';
-		}
-
 		if (PHP_VERSION_ID >= 80000) {
 			yield __DIR__ . '/../Reflection/data/unionTypes.php';
 			yield __DIR__ . '/../Reflection/data/mixedType.php';
diff --git a/tests/PHPStan/Analyser/data/getenv-php74.php b/tests/PHPStan/Analyser/nsrt/getenv-php74.php
similarity index 94%
rename from tests/PHPStan/Analyser/data/getenv-php74.php
rename to tests/PHPStan/Analyser/nsrt/getenv-php74.php
index f8769b28cd..1a0c3721d7 100644
--- a/tests/PHPStan/Analyser/data/getenv-php74.php
+++ b/tests/PHPStan/Analyser/nsrt/getenv-php74.php
@@ -1,4 +1,4 @@
-<?php
+<?php // lint <= 7.4
 
 namespace GetenvPHP74;
 
diff --git a/tests/PHPStan/Analyser/data/getenv-php80.php b/tests/PHPStan/Analyser/nsrt/getenv-php80.php
similarity index 95%
rename from tests/PHPStan/Analyser/data/getenv-php80.php
rename to tests/PHPStan/Analyser/nsrt/getenv-php80.php
index 572dea1700..63b50d7db9 100644
--- a/tests/PHPStan/Analyser/data/getenv-php80.php
+++ b/tests/PHPStan/Analyser/nsrt/getenv-php80.php
@@ -1,4 +1,4 @@
-<?php
+<?php // lint >= 80
 
 namespace GetenvPHP80;
 

From 7b176f3183ce25f17bd6a5f3491bbc4bba06d1c7 Mon Sep 17 00:00:00 2001
From: Vincent Langlet <vincentlanglet@hotmail.fr>
Date: Thu, 22 May 2025 16:51:19 +0200
Subject: [PATCH 8/8] Fix

---
 src/Php/PhpVersion.php                       | 5 -----
 tests/PHPStan/Analyser/nsrt/getenv-php74.php | 9 ++++++---
 tests/PHPStan/Analyser/nsrt/getenv-php80.php | 2 +-
 3 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/src/Php/PhpVersion.php b/src/Php/PhpVersion.php
index 9ef01c8475..b275c464eb 100644
--- a/src/Php/PhpVersion.php
+++ b/src/Php/PhpVersion.php
@@ -353,9 +353,4 @@ public function substrReturnFalseInsteadOfEmptyString(): bool
 		return $this->versionId < 80000;
 	}
 
-	public function getenvAcceptsNull(): bool
-	{
-		return $this->versionId >= 80000;
-	}
-
 }
diff --git a/tests/PHPStan/Analyser/nsrt/getenv-php74.php b/tests/PHPStan/Analyser/nsrt/getenv-php74.php
index 1a0c3721d7..a100e47686 100644
--- a/tests/PHPStan/Analyser/nsrt/getenv-php74.php
+++ b/tests/PHPStan/Analyser/nsrt/getenv-php74.php
@@ -1,4 +1,4 @@
-<?php // lint <= 7.4
+<?php // lint < 8.0
 
 namespace GetenvPHP74;
 
@@ -6,8 +6,11 @@
 
 class Foo
 {
-
-	public function test(string|null $stringOrNull, mixed $mixed)
+	/**
+	 * @param string|null $stringOrNull
+	 * @param mixed       $mixed
+	 */
+	public function test($stringOrNull, $mixed)
 	{
 		assertType('string|false', getenv(null));
 		assertType('array<string, string>', getenv());
diff --git a/tests/PHPStan/Analyser/nsrt/getenv-php80.php b/tests/PHPStan/Analyser/nsrt/getenv-php80.php
index 63b50d7db9..c5036fa153 100644
--- a/tests/PHPStan/Analyser/nsrt/getenv-php80.php
+++ b/tests/PHPStan/Analyser/nsrt/getenv-php80.php
@@ -1,4 +1,4 @@
-<?php // lint >= 80
+<?php // lint >= 8.0
 
 namespace GetenvPHP80;