← All results

non-falsy-string

Group: Advanced PHPDoc types · Category: ecosystem · File: phpdoc_advanced_fallback_non_falsy_string.php

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

Analyzer results

AnalyzerVersionResultDiagnostics
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]
  • Recognition: spelling resolved
  • Enforcement: 2/2 of the expected violations reported
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-rules
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]
  • Recognition: spelling resolved
  • Enforcement: 2/2 of the expected violations reported
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]
  • Recognition: spelling resolved
  • Enforcement: 2/2 of the expected violations reported
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]
  • Recognition: spelling resolved
  • Enforcement: 2/2 of the expected violations reported
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]
  • Recognition: spelling resolved
  • Enforcement: 1/2 of the expected violations reported
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]
  • Recognition: spelling resolved
  • Enforcement: 2/2 of the expected violations reported
intelephense 1.18.5intelephense 1.18.5 Not enforced

No diagnostics reported.

  • Recognition: spelling resolved
  • Enforcement: 0/2 of the expected violations reported
phpy 0.2.0phpy 0.2.0 Not enforced

No diagnostics reported.

  • Recognition: spelling resolved
  • Enforcement: 0/2 of the expected violations reported
qodana 262.8665.325Qodana 262.8665.325 Not enforced

No diagnostics reported.

  • Recognition: spelling resolved
  • Enforcement: 0/2 of the expected violations 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]
  • Recognition: spelling not resolved — reported on declaration line(s) 34
  • Enforcement: 0/2 of the expected violations reported — incidental, since the spelling was not resolved
  • False positives: line(s) 12
Expectation diff
Line 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]
  • Recognition: spelling resolved
  • Enforcement: 2/2 of the expected violations reported
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]
  • Recognition: spelling resolved
  • Enforcement: 2/2 of the expected violations reported
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]
  • Recognition: spelling resolved
  • Enforcement: 2/2 of the expected violations reported

Source

<?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