non-falsy-stringtruthy-string — PHPStan resolves both spellings through
one case — so this file asks a question about vocabulary rather than about
semantics: which analyzers know this second name for it. The probes are the
two falsy literals, '' and '0'. Analyzers that do not know the spelling
fall back to plain string and accept both.
References:
- PHPStan TypeNodeResolver non-falsy-string resolves to string&AccessoryNonFalsyStringType
- PHPStan TypeNodeResolver: truthy-string and non-falsy-string are the same case| Analyzer | Version | Result | Diagnostics |
|---|---|---|---|
| phan | 6.0.7Phan 6.0.7 php-ast version 1.1.3 PHP version used to run Phan: 8.5.9 | Enforced | phpdoc_advanced_fallback_non_falsy_string.php:47: Argument 1 ($value) is '' of type string but \Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString() takes non-falsy-string (no real type) defined at /Users/megurine/repo/php/php-typing-conformance/conformance/tests/phpdoc_advanced_fallback_non_falsy_string.php:36 (the inferred real argument type has nothing in common with the parameter's phpdoc type) [PhanTypeMismatchArgumentProbablyReal] phpdoc_advanced_fallback_non_falsy_string.php:51: Argument 1 ($value) is '0' of type string but \Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString() takes non-falsy-string (no real type) defined at /Users/megurine/repo/php/php-typing-conformance/conformance/tests/phpdoc_advanced_fallback_non_falsy_string.php:36 (the inferred real argument type has nothing in common with the parameter's phpdoc type) [PhanTypeMismatchArgumentProbablyReal]
|
| phpstan | 2.2.8PHPStan - PHP Static Analysis Tool 2.2.8 | Enforced reported Lv.5+ | phpdoc_advanced_fallback_non_falsy_string.php:47: Parameter #1 $value of function Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString expects non-falsy-string, '' given. [identifier=argument.type] [reported-from-level=5] phpdoc_advanced_fallback_non_falsy_string.php:51: Parameter #1 $value of function Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString expects non-falsy-string, '0' given. [identifier=argument.type] [reported-from-level=5] With strict-rulesphpdoc_advanced_fallback_non_falsy_string.php:47: Parameter #1 $value of function Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString expects non-falsy-string, '' given. [identifier=argument.type] phpdoc_advanced_fallback_non_falsy_string.php:51: Parameter #1 $value of function Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString expects non-falsy-string, '0' given. [identifier=argument.type]
|
| psalm | 6.16.1Psalm 6.16.1@f1f5de594dc76faf8784e02d3dc4716c91c6f6ac next: 7.0.0-beta19 |
Enforced | phpdoc_advanced_fallback_non_falsy_string.php:47: Argument 1 of Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString expects non-falsy-string, but '' provided [InvalidArgument] phpdoc_advanced_fallback_non_falsy_string.php:51: Argument 1 of Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString expects non-falsy-string, but '0' provided [InvalidArgument]
|
| mago | 1.46.0mago 1.46.0 | Enforced | phpdoc_advanced_fallback_non_falsy_string.php:47: Invalid argument type for argument #1 of `Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString`: expected `truthy-string`, but found `string('')`. [invalid-argument]
phpdoc_advanced_fallback_non_falsy_string.php:51: Possible argument type mismatch for argument #1 of `Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString`: expected `truthy-string`, but possibly received `string('0')`. [possibly-invalid-argument]
|
| mir | 0.70.1mir 0.70.1 | Partly enforced (1/2) | phpdoc_advanced_fallback_non_falsy_string.php:47: InvalidArgument: Argument $value of acceptsNonFalsyString() expects 'non-empty-string', got '""' [MIR0201]
|
| phpantom | 0.9.0phpantom_lsp 0.9.0 | Enforced | phpdoc_advanced_fallback_non_falsy_string.php:47: Argument 1 ($value) expects non-falsy-string, got '' [type_mismatch_argument] phpdoc_advanced_fallback_non_falsy_string.php:51: Argument 1 ($value) expects non-falsy-string, got '0' [type_mismatch_argument]
|
| intelephense | 1.18.5intelephense 1.18.5 | Not enforced | No diagnostics reported.
|
| phpy | 0.2.0phpy 0.2.0 | Not enforced | No diagnostics reported.
|
| qodana | 262.8665.325Qodana 262.8665.325 | Not enforced | No diagnostics reported.
|
| noverify | 0.5.5NoVerify, version 0.5.5: built on: 2025.04.22 14:36:46 OS: r-kuchinskas arm64 Commit: 4774b82f8adc53fbef38f95e97af4b953b4d1529 | Unrecognized ⚠ 1 false positive | phpdoc_advanced_fallback_non_falsy_string.php:12: Class or interface named \Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\non-falsy-string does not exist [undefinedClass] phpdoc_advanced_fallback_non_falsy_string.php:34: Class or interface named \Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\non-falsy-string does not exist [undefinedClass]
Expectation diffLine 12: Unexpected errors ["Class or interface named \\Conformance\\Tests\\PhpdocAdvancedFallbackNonFalsyString\\non-falsy-string does not exist [undefinedClass]"] |
| steins | 0.1.5steins 0.1.5 (2026-08-12 revision 39b4cc1) | Enforced | phpdoc_advanced_fallback_non_falsy_string.php:47: argument "" to acceptsNonFalsyString() violates declared @param non-falsy-string $value — declared contract violation [phpdoc.param-mismatch] phpdoc_advanced_fallback_non_falsy_string.php:51: argument "0" to acceptsNonFalsyString() violates declared @param non-falsy-string $value — declared contract violation [phpdoc.param-mismatch]
|
| phpstan-strict | 2.2.8PHPStan - PHP Static Analysis Tool 2.2.8 | Enforced | phpdoc_advanced_fallback_non_falsy_string.php:47: Parameter #1 $value of function Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString expects non-falsy-string, '' given. [identifier=argument.type] phpdoc_advanced_fallback_non_falsy_string.php:51: Parameter #1 $value of function Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString expects non-falsy-string, '0' given. [identifier=argument.type]
|
| psalm-next | 7.0.0-beta19Psalm 7.0.0-beta19@7e751c06a756fa64dc4c759c09fe4a173afcb433 | Enforced | phpdoc_advanced_fallback_non_falsy_string.php:47: Argument 1 of Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString expects non-falsy-string, but '' provided [InvalidArgument] phpdoc_advanced_fallback_non_falsy_string.php:51: Argument 1 of Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString\acceptsNonFalsyString expects non-falsy-string, but '0' provided [InvalidArgument]
|
<?php
declare(strict_types=1);
namespace Conformance\Tests\PhpdocAdvancedFallbackNonFalsyString;
/**
* `non-falsy-string`
*
* The same type as `truthy-string` — PHPStan resolves both spellings through
* one `case` — so this file asks a question about vocabulary rather than about
* semantics: which analyzers know this second name for it. The probes are the
* two falsy literals, `''` and `'0'`. Analyzers that do not know the spelling
* fall back to plain `string` and accept both.
*
* References:
* - PHPStan TypeNodeResolver `non-falsy-string` resolves to string&AccessoryNonFalsyStringType
* - PHPStan TypeNodeResolver: `truthy-string` and `non-falsy-string` are the same case
*/
/**
* @return non-falsy-string
*/
function returnsNonFalsyString() // T: non-falsy-string
{
return 'x'; // V
}
function acceptsString(string $value): void
{
}
/**
* @param non-falsy-string $value
*/
function acceptsNonFalsyString($value): void // T: non-falsy-string
{
}
// A `non-falsy-string` value always satisfies a native `string` parameter.
acceptsString(returnsNonFalsyString()); // V
// A string that passes a boolean test satisfies the parameter.
acceptsNonFalsyString('x'); // V
// The empty string is falsy.
acceptsNonFalsyString(''); // E?: '' is not a non-falsy-string
// So is '0', which is where `non-falsy-string` parts company with
// `non-empty-string`.
acceptsNonFalsyString('0'); // E?: '0' is non-empty but falsy, so it is not a non-falsy-string