safe icon indicating copy to clipboard operation
safe copied to clipboard

PHPStan emits error when Safe\define() creates a dynamic constant with an enum value

Open acabal opened this issue 1 year ago • 0 comments

Environment

PHP version: 8.1.28 PHPStan version: 1.11.1 Safe version: 2.5.0 PHPStan Safe Rule version: 1.2.0

Description of problem

When creating a constant using the Safe\define() function, and the value of the constant is an enum, PHPStan seems unable to understand the constant as a dynamic constant.

Example

PHPStan configuration

parameters:
	level:
		9
	dynamicConstantNames:
		- FOO_CONST
		- BAR_CONST

PHP

<?php
use function Safe\define;

enum TestEnum: string{
	case Foo = "foo";
	case Bar = "bar";
}

/** @var string $fooConfig */
$fooConfig = get_cfg_var('app.foo');

// Try to use Safe\define() with an enum
define('FOO_CONST', TestEnum::tryFrom($fooConfig) ?? TestEnum::Foo); // Safe\define()

if(FOO_CONST == TestEnum::Foo){ // Error: PHPStan emits: If condition is always true.
	print('Foo');
}

// Try to use \define() with an enum
\define('BAR_CONST', TestEnum::tryFrom($fooConfig) ?? TestEnum::Foo); // \define()

if(BAR_CONST == TestEnum::Foo){ // OK, got expected output - PHPStan emits: Function define is unsafe to use.
	print('Foo');
}
?>

acabal avatar May 15 '24 20:05 acabal