2

假设以下代码:

<?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 一直在抱怨我在函数Expected type 'string'. Found 'string[]'.中使用的所有四个实例......$dest

那个 intelephense 不喜欢我的代码的什么地方?请注意,页面运行良好......那 string[] 类型是什么?implode()返回一个字符串,那么这里有什么问题?

编辑:这很可能是一个 intelephense 的错误......

$dest是这样计算的:

$dest = dirname(SOURCE_PATH, 1) . '\ToUpload\\';

这不涉及explode()ing,实际上错误消失了......所以不知何故 intelephense 没有考虑到implode()返回一个字符串而不是一个数组......

实际上,我在 github 上提交了一个错误报告,我正在等待 Mewburn 对此的回应...... :)

4

2 回答 2

2

全局变量在 intelephense 中可能有点不稳定,已经存在改进支持的问题。在这种特定情况下,推断的类型由第一个赋值决定。由于那是explode 语句,它会假设$dest是一个字符串数组。

有几个解决方案:

  • 确保$dest用注释说明类型是什么。

    function transfer(string $file)
    {
        /** @var string $dest */
        global $dest;
    }
    
  • 确保第一个赋值$dest实际上是一个字符串:

    $tempdest = explode('\\', SOURCE_PATH);
    $tempdest[count($tempdest) - 2] = 'ToUpload';
    $dest = implode('\\', $dest);
    
于 2021-10-19T15:17:09.567 回答
0

我认为,这是因为内爆参数已更改。

https://www.php.net/manual/de/migration74.deprecated.php 说如下:

具有历史参数顺序的内爆不推荐以相反的顺序将参数传递给 implode(),请使用 implode($glue, $parts) 代替 implode($parts, $glue)。

于 2022-01-21T08:23:37.873 回答