在 VS Code 上出现了 Intelphense 错误:期望类型为 'string',但发现是 'string[]'。

7
假设有以下代码片段:
<?php
declare (strict_types = 1);

define('SOURCE_PATH', 'C:\xampp\htdocs\atlantis\ProductImages\\');

$dest = explode('\\', SOURCE_PATH);
$dest[count($dest) - 2] = 'ToUpload';
$dest = implode('\\', $dest);

function transfer(string $file)
{
    global $dest;

    if (!@chdir($dest)) {
        mkdir($dest);
        chdir($dest);
    }

    // ...
}

function compress(string $path)
{
    global $dest;

    $zip = new ZipArchive();
    $zip->open(dirname($dest, 1) . '\\' . explode('\\', SOURCE_PATH)[count(explode('\\', SOURCE_PATH)) - 2] . '.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

    // ...
}

在VS Code上,intelephense一直在抱怨我在函数中使用$dest的所有四个实例中出现了Expected type 'string'. Found 'string[]'的问题...
intelephense不喜欢我的代码哪里?请注意,页面运行正常...那么什么是string []类型?implode()返回一个字符串,那这里有什么问题?
编辑:这很可能是intelephense的一个bug...
我是这样计算$dest的: $dest = dirname(SOURCE_PATH, 1) . '\ToUpload\\'; 这没有涉及到explode(),而且错误已经消失了...所以某种程度上,intelephense无法考虑到implode()返回的是一个字符串而不是一个数组...
实际上,我在GitHub上提交了一个错误报告,并等待Mewburn的回复... :)
2个回答

7

全局变量在Intelephense中可能有些棘手,已经存在一个问题来改善支持。在这种特定情况下,推断的类型由第一次赋值确定。由于这是爆炸语句,它会假设$dest是一个字符串数组。

有几个解决方案:

  • Make sure to intelephense what the type of $dest is with comments.

    function transfer(string $file)
    {
        /** @var string $dest */
        global $dest;
    }
    
  • Make sure the first assignment of $dest actually is a string:

    $tempdest = explode('\\', SOURCE_PATH);
    $tempdest[count($tempdest) - 2] = 'ToUpload';
    $dest = implode('\\', $dest);
    

有没有办法让Intelephense正确地处理包含字符串和整数的全局数组? - Dan Schmidt

0

我认为这是因为implode参数已经被更改了。

https://www.php.net/manual/de/migration74.deprecated.php中提到:

使用历史参数顺序的implode,将参数以相反的顺序传递给implode()已被弃用,请使用implode($glue, $parts)代替implode($parts, $glue)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接